javascript - 类似数组/映射的数据结构,具有对项目的唯一 ID 支持、O(1) get() 方法且无重复

标签 javascript arrays typescript data-structures

我有很多数据存储在数组中。所有数组项都有一个字符串唯一 ID(如 123e4567-e89b-12d3-a456-426614174000 )。在推送项目之前,我调用 findIndex 以确保没有插入具有相同 ID 的重复项。我经常按索引和 ID (find(i => i.id === UUID)) 访问数组项
有没有更有效的数据结构呢?支持这些功能:

  • 已订购商品(应支持 push , unshift )
  • 在 O(1) 时间内按 ID 获取项目(更快的 find)
  • 在 O(1) 时间内按 ID 获取项目索引(更快的 findIndex)
  • 按索引获取项目(arr[index])
  • 没有 ID 重复(#2 将使其易于支持)
  • 简单迭代(for..of/forEach)
  • 排序项目

  • 我查看了常规对象和 map ,但它们不支持通过索引或排序访问项目。

    最佳答案

    使用由 ID 索引的对象或 map 可以正常工作。访问对象键将是 O(1) ,就像 Map.has .
    为了得到 O(1) 中的项目索引同样,无需再次迭代对象或 Map,创建另一个数据结构,将 ID 映射到其索引。

    const itemsById = new Map();
    const itemsByIndex = new Map();
    const addItem = (item) => {
      if (itemsById.has(item.id)) return; // duplicate already exists
      itemsById.set(item.id, item);
      itemsByIndex.set(itemsByIndex.size, item);
    };
    
    map 可以通过 for..of 进行迭代.对象可以通过 .entries() 进行迭代.
    要“排序”,请将值放入数组中,对数组进行排序,然后更改 itemsByIndex如所须。

    关于javascript - 类似数组/映射的数据结构,具有对项目的唯一 ID 支持、O(1) get() 方法且无重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65095718/

    相关文章:

    javascript - html 表格排序功能无法正常工作

    javascript - jQuery ..如何将文本附加到现有文本的末尾?

    arrays - 如何限制 PostgreSQL 中数组的长度?

    javascript - 使用 React-Native 将图像上传到 Firebase

    javascript - 如何在语义-ui react 中设置最小高度

    javascript - 我可以将数组传递给 fromCharCode 吗

    javascript - 来自 Javascript 数组的 Html 表

    angular - 为什么 typescript-eslint 强制 enumMember 使用驼峰命名法?

    javascript - Angular2 中的响应式(Reactive)选择

    php - 如何使用 PHP API 和 AngularJS 2 服务正确处理/获取正确的 JSON 响应?