【发布时间】:2015-08-19 16:09:48
【问题描述】:
我即将使用forOwn 来遍历对象的属性并手动创建一个数组,我不禁想到已经有一个可用的单行器来完成它。
{
prop1 : "value",
prop2: { sub:1}
}
到:
[
{key: "prop1", value: "value"},
{key: "prop2", value: {sub:1}}
]
谢谢
【问题讨论】:
标签: javascript lodash
我即将使用forOwn 来遍历对象的属性并手动创建一个数组,我不禁想到已经有一个可用的单行器来完成它。
{
prop1 : "value",
prop2: { sub:1}
}
到:
[
{key: "prop1", value: "value"},
{key: "prop2", value: {sub:1}}
]
谢谢
【问题讨论】:
标签: javascript lodash
您可以将 lodash 的 _.map() 与 shorthand property names 一起使用:
const obj = {
prop1 : "value",
prop2: { sub:1}
};
const result = _.map(obj, (value, prop) => ({ prop, value }));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
或者您可以使用Object#entries 与Array.map() 和array destructuring 来实现:
const obj = {
prop1 : "value",
prop2: { sub:1}
};
const result = Object.entries(obj).map(([prop, value]) => ({ prop, value }));
console.log(result);
【讨论】:
_.map(),因为它更具可读性(至少对我而言)。
Object.entries 仅在 ES2017 中可用,因此如果使用 ES2015 (ES6),则无法使用。
const result = _.map(obj, (value, prop) => ({ prop, value })); 而不是:const result = _.map(obj, (prop, value) => ({ prop, value }));?
prop) 作为第二个参数传递时。
你甚至不需要 lodash:
var arr = Object.keys(obj).map(function(key){
return { key: key, value: obj[key] };
});
【讨论】:
while 循环进行迭代。但话又说回来,这个问题从不问性能,而是问已经可用的东西。
一点点 ES6:
_.map( obj, (value, key) => ({key,value}) )
【讨论】:
如果适合您的情况,您可以使用pairs:
_.pairs({ 'barney': 36, 'fred': 40 });
// → [['barney', 36], ['fred', 40]]
【讨论】:
如果你使用 lodash/fp,你可以使用_.entries
const a = { one: 123, two: { value: 'b' }};
const pairs = _.entries(a).map(p => ({ key:p[0], value: p[1] }))
console.log(pairs)
// [
// {
// "key": "one",
// "value": 123
// },
// {
// "key": "two",
// "value": {
// "value": "b"
// }
// }
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/4.15.0/lodash-fp.js"></script>
【讨论】:
为了回应 Ori 的评论和完整性,我发布了 _.forOwn 版本。它稍微快一点,但您需要先声明数组(不是单行)。
var arr = [];
_.forOwn(obj,function(item, key) {
arr.push({ property : key, value : item});
});
【讨论】: