基本上我有一个数组,如:
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作为对象的键(以及我可能没有正确传递备忘录以进行缩减..)
将这种数组转换为该对象的最简单方法是什么?
答案 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。 但正如在其他答案中所指出的,这项任务实际上不需要非核心。