规范化对象数组&密钥由id

时间:2017-01-30 16:26:03

标签: javascript underscore.js javascript-objects normalization

我希望规范化从API返回的一些数据。已在项目中使用下划线。

var res = [{
    badge_no: 123,
    id: 1,
    name: 'bob'
  }, {
    badge_no: 456,
    id: 2,
    name: 'bill'
  }, {
    badge_no: 789,
    id: 3,
    name: 'ben'
  },
  // etc
];

我希望创建一个看起来像这样的数据结构:

var normalisedRes = [{
  1: {
    badge_no: 123,
    id: 1,
    name: 'bob'
  }
}, {
  2: {
    badge_no: 456,
    id: 2,
    name: 'bill'
  }
}, {
  3: {
    badge_no: 789,
    id: 3,
    name: 'ben'
  }
}];

将id保留在obj中非常重要。我相信我可以用reduce完成这项任务,但我正在努力。

感谢您的帮助!

编辑:这个问题现已得到解答。

根据这里的一些建议,我决定将数据规范化以返回一个看起来像的obj:

{ '1': {data}, '2':{data}, '3':{data} }

为了做到这一点,我使用了reduce,正如我原先认为的那样:

var normalised = res.reduce((acc, person) => { acc[person.id] = person; return acc; }, {});

再次感谢所有答案!

5 个答案:

答案 0 :(得分:1)

您可以使用Array#map()

执行此操作



var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}];

var result = res.map(e => ({[e.id]: e}))
console.log(result)




如果您愿意,也可以使用reduce()map()应该完成工作。



var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}];

var result = res.reduce((r, e) => (r.push({[e.id]: e}), r), [])
console.log(result)




答案 1 :(得分:1)

您可以将Array#map与对象一起使用,并使用id设置密钥并返回该对象。



var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }],
    result = array.map(function (a) {
        var o = {};
        o[a.id] = a;
        return o;
   });

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




使用ES6,您可以使用计算属性。



var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }],
    result = array.map(a => ({ [a.id]: a }));

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:1)

您无法将整数用作对象中的键。所以你的例子是不可能的。 请参阅此相关问题:Javascript: Using integer as key in associative array?

答案 3 :(得分:0)

这些解决方案是不是与直觉相反,在数组上使用 HashTable 的重点是,如果您必须使用 Array.find((item)=>{...}) 它必须遍历每条记录为了找到你想要的,reduce 将遍历数组中的每一项,map 将返回一个新数组,即:你将得到一个带有 objectKey:{...object} 的数组,最好的做法是是从后端返回一个哈希,这实际上是 firebase 所做的,例如

答案 4 :(得分:0)

_.indexBy 完全符合要求。