Javascript - 类似于序列的数组对象

时间:2017-08-18 16:33:19

标签: javascript

通常会有一些任务,比如在购物车中添加商品。如果购物车是一个数组,则需要O(n)来按ID检索商品。使用对象是O(1),但它不保证具有插入顺序。

那么有一种优雅的方法可以在保持插入顺序的同时拥有快速查找对象吗?

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);
}