将此数组转换为带下划线的对象

时间:2015-07-23 18:47:12

标签: javascript arrays underscore.js

基本上我有一个数组,如:

var q = [ { box: false, name: 'A1', stats: ['average'] }, 
          { box: false, name: 'A2', stats: ['min', 'max'] } ]

我想将此数组转换为

{ A1: ['average'], A2: ['min', 'max'] }

我尝试使用reduce IE:

_.reduce(q, function(statHash, val) {
return _.extend(statHash, {val.name: val.stats}) }, {})

现在这不起作用,因为我无法引用val.name作为对象的键(以及我可能没有正确传递备忘录以进行缩减..)

将这种数组转换为该对象的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

试试这个......

var q = [ { box: false, name: 'A1', stats: ['average'] },
{ box: false, name: 'A2', stats: ['min', 'max'] } ]

var testObj = {};

for (var i = 0; i < q.length; i++) {
  testObj[q[i].name] = q[i].stats;
}

答案 1 :(得分:2)

你的直觉是正确的; reduce是正确的方法:

var q = [ { box: false, name: 'A1', stats: ['average'] }, 
          { box: false, name: 'A2', stats: ['min', 'max'] } ];

var result = q.reduce(function(res, obj) {
  res[obj.name] = obj.stats;
  return res;
}, {});

console.log(result);
// => { A1: ["average"], A2: ["min", "max"] }

请记住,在所有现代浏览器中都有reduce is standard,因此除非您支持IE8,否则不需要Underscore.js。如果你必须支持IE8,它在下划线中是相同的,除非你打电话给_.reduce(q, function...而不是q.reduce(function...

答案 2 :(得分:1)

您的解决方案的逻辑非常好,您只有语法问题,因为您无法像这样初始化内联对象。 (因此unexpected token: .错误)

如果将对象声明移动到单独的语句中,则代码无需任何进一步修改即可正确运行:

var q = [ { box: false, name: 'A1', stats: ['average'] }, 
      { box: false, name: 'A2', stats: ['min', 'max'] } ]

var reduced = _.reduce(q, function(statHash, val) {
      var o = {}; o[val.name] = val.stats;
      return _.extend(statHash, o);
}, {});
带有固定代码的

Here's a plunkr。 但正如在其他答案中所指出的,这项任务实际上不需要非核心。