gpt4 book ai didi

javascript - 如何安排一个javascript对象以获得更好的性能

转载 作者:行者123 更新时间:2023-11-29 18:40:49 24 4
gpt4 key购买 nike

我有一个数据对象说 -

const data = {
'root': [
{
id: 1,
name: 'demo',
children: [
{
id: 2,
name: 'demo2',
children: [
{
id: 3,
name: 'demo3',
children: []
},
{
id: 4,
name: 'demo4',
children: [
{
id: 5,
name: 'demo5',
children: []
}
]
}
]
}
]
}
]
}

现在我的问题是,如果我想执行添加/编辑/删除操作,例如,我想编辑一个具有 id = 5 的对象,那么我必须访问 root[0].children[0].children[1].children[0],这条路线完成任务。我认为这会很昂贵,并且该对象可能具有更多嵌套的 children 属性。

那么有没有其他结构可以让我重新排列我的对象并执行快速添加/编辑/删除操作?

最佳答案

由于 id 值是唯一的,您可以维护一个直接引用条目的 Map(或对象),而不管它们在父/子中的什么位置结构。父/子结构将只包含子对象的 id 而不是实际的子对象,例如:

const data = {
1: {
id: 1,
name: 'demo',
children: [2]
},
2: {
id: 2,
name: 'demo2',
children: [3, 4]
},
3: {
id: 3,
name: 'demo3',
children: []
},
4: {
id: 4,
name: 'demo4',
children: [5]
},
5: {
id: 5,
name: 'demo5',
children: []
}
};

通过ID访问就是简单的data[id]

该示例使用带有数字字符串键的对象(它们在上面写为文字数字,但属性名称始终是字符串 [或符号])。但是您可以改用 Map:

const data = new Map([
[1, {
id: 1,
name: 'demo',
children: [2]
}],
[2, {
id: 2,
name: 'demo2',
children: [3, 4]
}],
[3, {
id: 3,
name: 'demo3',
children: []
}],
[4, {
id: 4,
name: 'demo4',
children: [5]
}],
[5, {
id: 5,
name: 'demo5',
children: []
}]
]);

那些 map 键实际上是数字。通过 ID 访问只需 data.get(id)data.set(id, newEntry)

你会希望有函数来操作这个结构(添加、删除、移动)。您可以使用接受结构的独立函数,例如:

function removeEntry(data, id) {
const entry = data[id];
for (const childId of entry.children) {
removeEntry(data, childId);
}
delete data[id]; // The object version
// Or: data.delete(id); // The Map version
}

...或者您可以将所有这些捆绑到一个中。

关于javascript - 如何安排一个javascript对象以获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com