Ответ 1
Вы можете сделать
var arr = _.values(obj);
Для документации см. здесь.
Как я могу преобразовать большой 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...}]
Вы можете сделать
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": []
}
}
]"
Современное нативное решение, если кому-то интересно:
const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));
спасибо за улучшение @KoushikChatterjee
Для меня это сработало:
_.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
Обновление 2017: Object.values, значения lodash и 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);
Есть немало способов получить желаемый результат. Давайте разбить их на категории:
Только значения ES6:
Основным методом для этого является Object.values. Но используя Object.keys и Array.map, вы также можете получить ожидаемый результат:
Object.values(obj)
Object.keys(obj).map(k => obj[k])
var obj = {
A: {
name: "John"
},
B: {
name: "Ivan"
}
}
console.log('Object.values:', Object.values(obj))
console.log('Object.keys:', Object.keys(obj).map(k => obj[k]))
var arr = _.map(obj)
Вы также можете использовать функцию _.map
(как lodash
и underscore
) с object
, она будет внутренне обрабатывать этот случай, перебирать каждое значение и ключ с вашим итератором и, наконец, возвращать массив. На самом деле, вы можете использовать его без каких-либо итераторов (просто _.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>
Если вам нужно какое-то пользовательское отображение (например, оригинальный Array.prototype.map) объекта в массив, вы можете просто использовать _.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
для _.forEach https://lodash.com/docs/#forEach