繁体   English   中英

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

[英]Transforming this array into an object with underscore

本质上,我有一个数组,例如:

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引用为对象的键(以及我可能无法正确传递备忘录以进行减少。)

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

尝试这个...

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;
}

你的直觉是正确的; 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所有现代浏览器的标准配置 ,因此除非您坚持支持IE8,否则不需要Underscore.js。 如果必须支持IE8,则在_.reduce(q, function...相同,除了调用_.reduce(q, function...而不是q.reduce(function...

解决方案的逻辑非常好,您仅遇到语法问题,因为您不能像这样内联地初始化对象。 (因此出现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);
}, {});

这是带有固定代码的插件 但是,正如在其他答案中所指出的那样,对于此任务实际上不需要进行脱壳。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM