我希望规范化从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;
}, {});
再次感谢所有答案!
答案 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
完全符合要求。