如何确定对象是否在数组中

2022-08-30 00:42:04

我需要确定一个对象是否已经存在于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个实例。

没有查询


答案 1

使用类似如下的内容:

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

    return false;
}

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

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

    return false;
}

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


答案 2

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

看看这个: MDN索引数组

只需执行以下操作:

carBrands.indexOf(car1);

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

http://jsfiddle.net/Fraximus/r154cd9o

编辑:请注意,在问题中,要求是检查数组中引用的同一对象,而不是新对象。即使新对象的内容与数组中的对象相同,它仍然是一个不同的对象。如注释中所述,对象在 JS 中通过引用传递,同一对象可以在多个结构中多次存在。
如果你想创建一个新对象并检查数组是否包含与新对象相同的对象,这个答案将不起作用(Julien的小提琴下面),如果你想检查数组中是否存在相同的对象,那么这个答案将起作用。在这里和评论中查看小提琴。