преобразование объекта в массив с помощью lodash
как я могу преобразовать большая object
to array
С лодашь?
пример:
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...}]
спасибо!
9 ответов:
можно сделать
var arr = _.values(obj);
для документации см. здесь.
_.toArray(obj);
выходы:
[ { "name": "Ivan", "id": 12, "friends": [ 2, 44, 12 ], "works": { "books": [], "films": [] } }, { "name": "John", "id": 22, "friends": [ 5, 31, 55 ], "works": { "books": [], "films": [] } } ]"
для меня это работает:
_.map(_.toPairs(data), d => _.fromPairs([d]));
получается
{"a":"b", "c":"d", "e":"f"}
на
[{"a":"b"}, {"c":"d"}, {"e":"f"}]
Если вы хотите, чтобы ключ (id в этом случае) был сохранен как свойство каждого элемента массива, вы можете сделать
const arr = _(obj) //wrap object so that you can chain lodash methods .mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object .values() //get the values of the result .value() //unwrap array of objects
современное нативное решение, если кто-то заинтересован (спасибо за улучшение Koushik):
const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));
обновление 2017: "объект".значения, лодашь значения и toArray сделать это. И сохранить ключи карта и распространение оператор Играй:
// import { toArray, map } from 'lodash' const map = _.map const input = { key: { value: 'value' } } const output = map(input, (value, key) => ({ key, ...value })) console.log(output) // >> [{key: 'key', value: 'value'}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
преобразование объекта в массив с обычный JavaScript(
ECMAScript-2016
)Object.values
: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:[]}} } var values = Object.values(obj) console.log(values);
если вы также хотите сохранить ключи использовать
Object.entries
иArray#map
такой: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:[]}} } var values = Object.entries(obj).map(([k, v]) => ({[k]: v})) console.log(values);
var arr = _.map(obj)
можно использовать (как
lodash
иunderscore
) Сobject
кроме того, он будет внутренне обрабатывать этот случай, перебирать каждое значение и ключ с вашим iteratee и, наконец, возвращать массив. Фактически, вы можете использовать его без каких-либо итераций (просто_.map(obj)
) если вы просто хотите массив значений. Хорошая часть заключается в том, что, если вам нужна какая-либо трансформация между ними, вы можете сделать это в одном идти.пример:
var obj = { key1: {id: 1, name: 'A'}, key2: {id: 2, name: 'B'}, key3: {id: 3, name: 'C'} }; var array1 = _.map(obj, v=>v); console.log('Array 1: ', array1); /*Actually you don't need the callback v=>v if you are not transforming anything in between, v=>v is default*/ //SO simply you can use var array2 = _.map(obj); console.log('Array 2: ', array2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
однако, если вы хотите преобразовать свой объект, вы можете сделать это, даже если вам нужно сохранить ключ, вы можете это сделать (
_.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
(более читаемый для конкретного perpose), или получение пар, а затем карта и так далее. но в случае, если ваш код нуждается в гибкости, что вы можете обновить его в будущем, как вам нужно сохранитьkeys
или преобразование значений немного, то лучшим решением является использование одного_.map
как указано в этом ответе. Это будет bt не так сложно в соответствии с читаемостью также.
Если вы хотите, чтобы некоторые пользовательские карты (как и исходный массив.прототип.карте) объекта в массив, вы можете просто использовать
_.forEach
:let myObject = { key1: "value1", key2: "value2", // ... }; let myNewArray = []; _.forEach(myObject, (value, key) => { myNewArray.push({ someNewKey: key, someNewValue: value.toUpperCase() // just an example of new value based on original value }); }); // myNewArray => [{ someNewKey: key1, someNewValue: 'VALUE1' }, ... ];
посмотреть
lodash
doc of _.forEach https://lodash.com/docs/#forEach