Как я могу превратить большой object
в array
с lodash?
var obj = {
22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}
// transform to
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]
javascript
arrays
object
lodash
siavolt
источник
источник
Ответы:
Ты можешь сделать
Для документации см. Здесь.
источник
id
свойство не существует и вы хотите создать его на основе ключа каждого объекта.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
return
значение в массив следующим образом:const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });
я был бы признателен за любые комментарии или предложения по улучшению этого подхода.const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
Выходы как:
источник
toArray
нет способа сохранить ключи при необходимости.Современное нативное решение, если кому-то интересно:
или (не IE):
источник
Object.keys(obj).map(key=>({key,value: obj[key]}))
const arr = Object.keys(obj).map(id => ({ id, ...obj[id] }));
это приведет весь объект в возвращенные данные нет? (используя 'id', так как первоначальный аскер хотел сохранить свой ключ в качестве id)Для меня это сработало:
Получается
в
источник
_.map(data, (v,k)=>({[k]: v}))
подробнее см. Мой ответ._.toPairs
и_fromPairs
является дополнительным и ненужным здесь.[{key: 'someKey', val: 'The value'}, {....},...]
Есть немало способов получить желаемый результат. Давайте разбить их на категории:
Только значения ES6 :
Основным методом для этого является Object.values . Но используя Object.keys и Array.map, вы также можете получить ожидаемый результат:
Показать фрагмент кода
ES6 Key & Value :
Используя карту и ES6 динамические / вычисленные свойства и деструктурирование, вы можете сохранить ключ и вернуть объект с карты.
Показать фрагмент кода
Только Lodash Values :
Метод, разработанный для этого,
_.values
однако, есть как «горячие клавиши»_.map
и вспомогательный метод,_.toArray
который также возвращает массив, содержащий только значения из объекта. Вы могли бы также ,_.map
хотя_.keys
и получить значения из объекта с помощьюobj[key]
нотации.Примечание:
_.map
при передаче объект будет использовать свойbaseMap
обработчик, который в основном зависитforEach
от свойств объекта.Показать фрагмент кода
Lodash Key & Value :
Показать фрагмент кода
Обратите внимание, что в приведенных выше примерах используется ES6 (функции стрелок и динамические свойства). Вы можете использовать lodash
_.fromPairs
и другие методы для создания объекта, если ES6 является проблемой.источник
Если вы хотите, чтобы ключ (в данном случае id) был сохранен как свойство каждого элемента массива, вы можете сделать
источник
Обновление 2017: Object.values , значения lodash и toArray делают это. А для сохранения ключей карты и распространения оператора играть приятно:
источник
Преобразование объекта в массив с помощью простого JavaScript (
ECMAScript-2016
)Object.values
:Если вы также хотите сохранить использование ключей
Object.entries
иArray#map
вот так:источник
var arr = _.map(obj)
Вы также можете использовать
_.map
функцию (и тогоlodash
и другогоunderscore
)object
, она будет внутренне обрабатывать этот случай, перебирать каждое значение и ключ с вашим итератором и, наконец, возвращать массив. Infact, вы можете использовать его без каких-либо итераторов (просто_.map(obj)
), если вы просто хотите массив значений. Хорошая часть заключается в том, что если вам нужно какое-то преобразование между ними, вы можете сделать это за один раз.Пример:
Показать фрагмент кода
Однако, если вы хотите преобразовать свой объект, вы можете сделать это, даже если вам нужно сохранить ключ, вы можете сделать это (
_.map(obj, (v, k) => {...}
) с дополнительным аргументомmap
и затем использовать его по своему усмотрению.Однако существуют другие решения Vanilla JS для этого (так как каждое
lodash
решение должно иметь чистую версию JS), например:Object.keys
а затемmap
их значенияObject.values
(в ES-2017)Object.entries
а затемmap
каждая пара ключ / значение (в ES-2017)for...in
зацикливание и использование каждой клавиши для получения значенийИ многое другое. Но поскольку этот вопрос предназначен
lodash
(и предполагается, что кто-то уже использует его), вам не нужно много думать о версии, поддержке методов и обработке ошибок, если они не найдены.Существуют и другие решения типа lodash, такие как
_.values
(более читабельные для конкретных целей), или получение пар, а затем отображение и так далее. но в том случае, если вашему коду требуется гибкость, чтобы вы могли обновлять его в будущем, когда вам нужноkeys
немного сохранить или преобразовать значения, тогда лучшим решением будет использование одного,_.map
как указано в этом ответе. Это будет не так сложно, с точки зрения читабельности.источник
Объект для массива
Из всех ответов я думаю, что этот самый лучший:
что превращает:
чтобы:
Массив к объекту
Чтобы преобразовать обратно:
Чтобы преобразовать обратно, сохраняя ключ в значении:
Дам:
В последнем примере вы также можете использовать lodash
_.keyBy(arr, 'key')
или_.keyBy(arr, i => i.key)
.источник
Если вам нужно какое-то пользовательское отображение (например, оригинальный Array.prototype.map) объекта в массив, вы можете просто использовать
_.forEach
:Видеть
lodash
документ _.forEach https://lodash.com/docs/#forEachисточник