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

标签 javascript performance data-structures

我有一个数据对象 -

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/

相关文章:

javascript - jQuery 在函数和动画开始/动画结束事件上的问题

javascript - ASP.NET 上的 Jquery 掩码不起作用

sql - 使用GROUP BY执行SELECT的更好方法

c++ - C++ 风格转换对性能的影响?

c++ - 递归最小堆错误?

JavaScript 在特定计算机上运行速度非常慢

javascript - 为什么 gulp 提示超出最大调用堆栈大小?

c# - 托管在 Windows 服务中的 WCF 服务运行速度比控制台应用程序慢 10 倍

algorithm - (双向)链表 get() 复杂度

python - 对python中的元组列表进行排序