我怎样才能改变一个大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...}]
谢谢!
如果您希望将密钥(在本例中为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
_.toArray(obj);
输出为:
[ { "name": "Ivan", "id": 12, "friends": [ 2, 44, 12 ], "works": { "books": [], "films": [] } }, { "name": "John", "id": 22, "friends": [ 5, 31, 55 ], "works": { "books": [], "films": [] } } ]"
你可以做
var arr = _.values(obj);
有关文档,请参阅此处
对我来说,这工作:
_.map(_.toPairs(data), d => _.fromPairs([d]));
事实证明
{"a":"b", "c":"d", "e":"f"}
成
[{"a":"b"}, {"c":"d"}, {"e":"f"}]
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>
有很多方法可以得到您想要的结果。让我们按类别细分它们:
仅ES6值:
主要方法是Object.values。但是使用Object.keys和Array.map您也可以达到预期的结果:
Object.values(obj) Object.keys(obj).map(k => obj[k])
Object.values(obj) Object.keys(obj).map(k => obj[k])
使用纯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);
如果有兴趣,现代原生解决方案:
const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));
感谢@KoushikChatterjee的改进
var arr = _.map(obj)
您也可以使用_.map
(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>