Javascript-序列数组类对象

Javascript-序列数组类对象,javascript,Javascript,通常会有一些任务,比如将物品添加到购物车中。如果购物车是一个数组,则需要O(n)才能按id检索项目。使用对象是O(1),但不保证具有插入顺序 那么,有没有一种优雅的方法可以在保持插入顺序的同时快速查找对象呢?我通常会使用一个数组和一个对象来引用同一个对象。例如: var thingies = []; var thingiesById = Object.create(null); 添加“thingy”时: 例如: var thingies=[]; var thingiesById=Object

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


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

我通常会使用一个数组和一个对象来引用同一个对象。例如:

var thingies = [];
var thingiesById = Object.create(null);
添加“thingy”时:

例如:

var thingies=[];
var thingiesById=Object.create(null);
函数addThingy(thingy){
推(东西);
thingiesById[thingy.id]=thingy;
}
//注意:故意不按ID顺序添加它们
addThingy({id:3,名称:“thingy3”});
addThingy({id:1,名称:“Thingy 1”});
addThingy({id:2,名称:“thingy2”});
thingies.forEach(函数(thingy){
console.log(thingy.id+”:“+thingy.name);

});选项#1-保存两个选项。选项2-为什么您关心性能?您认为您会遇到一些性能问题吗?例如,在react中,我有一个产品(组件)列表。每次更新时,都需要检查它是否出现在购物车中。一种方法是将整个购物车传递给组件,每个组件都有一个O(n)检查。第二种方法是使用reduce()方法创建具有item.id的dict。但只要用户按下按钮,这些都会重新计算。因此,这是一个相当大的性能损失。将两个引用放在一起可能会导致不一致,并且很难维护。地图看起来很酷,可能就是我要找的。如果物品已经在地图上,那么添加数量是可能的,或者非常简单?@Nakamura:如果你把它包装成一个可以为你管理的对象,那么维护起来就不难了。重新映射:当然,您可以存储一个带有计数的包装器对象。
thingies.push(thingy);
thingiesById[thingy.id] = thingy;