属性值对象的对象数组

时间:2016-07-08 07:02:12

标签: javascript dictionary

我有这些数据:

[
    {foo: 1, bar: a},
    {foo: 2, bar: b},
    {foo: 3, bar: c},
]

将数据转换为

之类的最简单方法是什么
{
    customLabel1 : [1,2,3],
    customLabel2 : [a,b,c]
}

我想出了这个

{
    customLabel1: data.map((a) => {return a.foo} ),
    customLabel2: data.map((a) => {return a.bar} )
}

有更简单的方法可以做到这一点,还是更快?

4 个答案:

答案 0 :(得分:1)

如果您想要更简单,您的代码已经非常接近胖箭头语法。您可以删除括号和return关键字:

{
    customLabel1: data.map(a => a.foo),
    customLabel2: data.map(a => a.bar)
}

如果你想要更快,我认为你必须牺牲一些简单性。在编写完成后,您将在data上循环两次。如果你迭代一次,它看起来像这样:



var data = [
    {foo: 1, bar: 'a'},
    {foo: 2, bar: 'b'},
    {foo: 3, bar: 'c'},
];

var o = {customLabel1: [], customLabel2: []};
data.forEach(a => {
  o.customLabel1.push(a.foo);
  o.customLabel2.push(a.bar);
});
console.log(o);




答案 1 :(得分:1)

map调用的较短语法可以是:

data.map(el => el.prop);

话虽如此,我为此定义了一个辅助函数:

function pluck(arr, props) {
   return Object.keys(props).reduce((ret, prop) => {
     ret[prop] = arr.map(el => el[props[prop]]);
     return ret;
   }, {});
} 

var ret = pluck(data, {
  customLabel1: 'foo',
  customLabel2: 'bar'
});

答案 2 :(得分:1)

如果您不知道密钥,可以使用此表单

{
    customLabel1: data.map(function(element) { return element[Object.keys(element)[0]];}),
    customLabel2: data.map(function(element) { return element[Object.keys(element)[1]];})
}

答案 3 :(得分:1)

您可以使用对象进行键映射,然后迭代。



var data = [{ foo: 1, bar: 'a' }, { foo: 2, bar: 'b' }, { foo: 3, bar: 'c' }],
    labels = { customLabel1: 'foo', customLabel2: 'bar' },
    result = {};

data.forEach(a => Object.keys(labels).forEach(k => {
    result[k] = result[k] || [];
    result[k].push(a[labels[k]]);
}));

console.log(result);