将JS对象数组转换为嵌套形式的最有效方法

Most efficient way to transform array of JS objects to nested form?

本文关键字:有效 方法 嵌套 对象 JS 数组 转换      更新时间:2023-09-26

我想转换:

[
    {id: 1, name: 'one', desc: 'one'},
    {id: 2, name: 'two', desc: 'two'},
    {id: 3, name: 'three', desc: 'three'}
]

{
    1: {id: 1, name: 'one', desc: 'one'},
    2: {id: 2, name: 'two', desc: 'two'},
    3: {id: 3, name: 'three', desc: 'three'}
}

做到这一点最有效/最高效的方法是什么?一些选择是:

1)https://github.com/gaearon/normalizr

2) d3.nest()

3) const object = {}; array.forEach(item => { object[item.id] = item });

我喜欢Array.prototype.reduce()解决方案。看看这个

var arr = [{id: 1, name: 'one', desc: 'one'}, {id: 2, name: 'two', desc: 'two'}, {id: 3, name: 'three', desc: 'three'}],
    obj = arr.reduce((p,c) => {p[c.id] = c; return p},{});
document.write("<pre>" + JSON.stringify(obj,null,2) + "</pre>");

您还可以使用一个简单的循环:

var arr = [{id: 1, name: 'one', desc: 'one'}, {id: 2, name: 'two', desc: 'two'}, {id: 3, name: 'three', desc: 'three'}],
    obj = {}
for(var item of arr) obj[item.id] = item;

循环通常比ES5数组方法更快,因为它们不必在每次迭代时调用函数。

我想说它是:

const obj = Object.assign( {}, array );

尽管如此,我还没有将它的性能与您的选择进行比较。

试试这个:

ar = [
    {id: 1, name: 'one', desc: 'one'},
    {id: 2, name: 'two', desc: 'two'},
    {id: 3, name: 'three', desc: 'three'}
]
var result = ar.reduce((ac, x) => {return ac[x.id] = x , ac ;}, {})
document.write( JSON.stringify(result) )

但请记住,键是字符串,处理的是对象而不是数组。。。