将数组转换为对象的有效方法,其中每个键都是数组成员的值

时间:2017-03-28 12:12:21

标签: javascript

假设我有这些数据:

var obj = [
 {
   type: 1,
   value: "abc" 
 },
 {
   type: 2,
   value: "abcde"
 },
 {
   type: 1,
   value: "fghez"
 }
];

JavaScript中是否有一种高效优雅的方法将其转换为对象,如下所示?

var sortedByType = {
  1: [ "abc", "fghez" ],
  2: [ "abcde" ]
}

显然,您可以遍历obj中的每个元素,阅读type属性并将value添加到新对象中,逐个汇总结果,如下所示。但它有点奇怪,长久,低效,不优雅。

var sortedByType = {};
for (var i = 0; i < obj.length; i++) {
  var type = obj[i].type;
  if (!sortedByType[type]) { sortedByType[type] = []; }

  sortedByType[type].push(obj[i].value);
}

3 个答案:

答案 0 :(得分:0)

使用Array#forEach的优雅解决方案。迭代arr数组。如果obj实际上没有迭代对象的type,请将type设置为obj密钥并将其value推入其中。如果有 - 只需将value推入数组。

var arr = [{type:1,value:"abc"},{type:2,value:"abcde"},{type:1,value:"fghez"}], obj = {};
    arr.forEach(v => (obj[v.type] || (obj[v.type] = [])).push(v.value));

    console.log(obj);

答案 1 :(得分:0)

另一个优雅的解决方案是使用Array#reduce方法:

您可以构建一个数组,但它会有未定义的索引(这就是我将filter放在最后的原因):

obj.reduce((acc, val) => {
  if (!acc[val.type])
    acc[val.type] = [];
  acc[val.type].push(val.value)
  return acc;
}, []).filter(n => n)


OR 编辑

你可以建立一个对象:

obj.reduce((acc, val) => {
  let key = val.type.toString();
  (acc[key] || (acc[key] = [])).push(val.value)
  return acc;
}, {})

-

旧JS版:

obj.reduce(function (acc, val) {
  var key = val.type.toString();
  (acc[key] || (acc[key] = [])).push(val.value)
  return acc;
}, {})


最好的问候,

答案 2 :(得分:0)

您可以将Array#reduce与对象一起用作累加器。

&#13;
&#13;
var array = [{ type: 1, value: "abc" }, { type: 2, value: "abcde" }, { type: 1, value: "fghez" }],
    result = array.reduce(function (r, a) {
        if (!r[a.type]) {
           r[a.type] = [];
        }
        r[a.type].push(a.value);
        return r;
    }, Object.create(null));

console.log(result);
&#13;
&#13;
&#13;