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