通常会有一些任务,比如在购物车中添加商品。如果购物车是一个数组,则需要O(n)来按ID检索商品。使用对象是O(1),但它不保证具有插入顺序。
那么有一种优雅的方法可以在保持插入顺序的同时拥有快速查找对象吗?
答案 0 :(得分:1)
我通常通过使用数组和引用相同对象的对象来完成此操作。 E.g:
var thingies = [];
var thingiesById = Object.create(null);
添加" thingy":
thingies.push(thingy);
thingiesById[thingy.id] = thingy;
示例:
var thingies = [];
var thingiesById = Object.create(null);
function addThingy(thingy) {
thingies.push(thingy);
thingiesById[thingy.id] = thingy;
}
// Note intentionally not adding them in ID order
addThingy({id:3, name: "Thingy 3"});
addThingy({id:1, name: "Thingy 1"});
addThingy({id:2, name: "Thingy 2"});
thingies.forEach(function(thingy) {
console.log(thingy.id + ": " + thingy.name);
});

ES2015 +' s Map
维护插入顺序并提供遵循该顺序的迭代语义。您将要测试get
上的查找速度是否符合您的要求。
示例:
const thingies = new Map();
function addThingy(thingy) {
thingies.set(thingy.id, thingy);
}
// Note intentionally not adding them in ID order
addThingy({id:3, name: "Thingy 3"});
addThingy({id:1, name: "Thingy 1"});
addThingy({id:2, name: "Thingy 2"});
for (const thingy of thingies.values()) {
console.log(thingy.id + ": " + thingy.name);
}