如何判断对象是否在数组中

新手上路,请多包涵

我需要确定一个对象是否已经存在于 javascript 的数组中。

例如(虚拟代码):

var carBrands = [];

var car1 = {name:'ford'};
var car2 = {name:'lexus'};
var car3 = {name:'maserati'};
var car4 = {name:'ford'};

carBrands.push(car1);
carBrands.push(car2);
carBrands.push(car3);
carBrands.push(car4);

现在“carBrands”数组包含所有实例。

我现在正在寻找一个快速的解决方案来检查 car1、car2、car3 或 car4 的实例是否已经在 carBrands 数组中。

例如:

var contains =  carBrands.Contains(car1); //<--- returns bool.

car1 和 car4 包含相同的数据,但它们是不同的实例,它们应该被测试为不相等。

我是否在创建时向对象添加了诸如哈希之类的东西?或者有没有更快的方法在 Javascript 中做到这一点。

我在这里寻找最快的解决方案,如果很脏,那么它必须是;)在我的应用程序中,它必须处理大约 10000 个实例。

没有jQuery

原文由 Caspar Kleijne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

使用这样的东西:

 function containsObject(obj, list) {
 var i;
 for (i = 0; i < list.length; i++) {
 if (list[i] === obj) {
 return true;
 }
 }

 return false;
 }

在这种情况下, containsObject(car4, carBrands) 为真。删除 carBrands.push(car4); 调用,它将返回 false 。如果您稍后扩展为使用对象来存储这些其他汽车对象而不是使用数组,您可以使用类似这样的东西:

 function containsObject(obj, list) {
 var x;
 for (x in list) {
 if (list.hasOwnProperty(x) && list[x] === obj) {
 return true;
 }
 }

 return false;
 }

这种方法也适用于数组,但是当用于数组时,它会比第一个选项慢一点。

原文由 cdhowie 发布,翻译遵循 CC BY-SA 3.0 许可协议

为什么不用javascript数组的 indexOf 方法呢?

看看这个: MDN indexOf Arrays

简单地做:

 carBrands.indexOf(car1);

它将返回 car1 的索引(数组中的位置)。如果在数组中找不到 car1,它将返回 -1。

http://jsfiddle.net/Fraximus/r154cd9o

编辑: 请注意,在问题中,要求是检查 数组中引用的相同对象,而不是新对象。即使新对象的内容与数组中的对象相同,它仍然是不同的对象。正如评论中提到的, 对象在 JS 中是通过引用传递的,同一个对象可以在多个结构中存在多次。

如果你想创建一个新对象并检查数组是否包含与你的新对象相同的对象,这个答案将不起作用(下面的 Julien 的小提琴),如果你想检查数组中是否存在相同的对象,那么这个答案将工作。在此处和评论中查看小提琴。

原文由 Frax 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题