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

如(dummycode):

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数组中。

eg:

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

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

我是否需要在创建对象时添加散列之类的东西?或者在Javascript中有更快的方法来做到这一点。

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

没有jquery


当前回答

你可以使用相等运算符:==。默认情况下,对象是通过引用进行检查的,因此甚至不需要使用===操作符。

试试这个,只是确保你在car1的位置使用了正确的变量引用:

var i, car, l = cars.length;

for (i = 0; i < l; i++)
{
  if ((car = cars[i]) == car1)
  {
    break;
  }
  else car = null;
}

编辑添加:

前面提到了一个数组扩展,下面是它的代码:

Array.prototype.contains = Array.prototype.contains || function(obj)
{
  var i, l = this.length;
  for (i = 0; i < l; i++)
  {
    if (this[i] == obj) return true;
  }
  return false;
};

注意,我正在缓存length值,因为Array的length属性实际上是一个访问器,这比内部变量稍微慢一些。

其他回答

可以这样说:

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。如果你后来扩展到使用对象来存储这些其他car对象,而不是使用数组,你可以使用这样的东西:

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

    return false;
}

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

你可以使用相等运算符:==。默认情况下,对象是通过引用进行检查的,因此甚至不需要使用===操作符。

试试这个,只是确保你在car1的位置使用了正确的变量引用:

var i, car, l = cars.length;

for (i = 0; i < l; i++)
{
  if ((car = cars[i]) == car1)
  {
    break;
  }
  else car = null;
}

编辑添加:

前面提到了一个数组扩展,下面是它的代码:

Array.prototype.contains = Array.prototype.contains || function(obj)
{
  var i, l = this.length;
  for (i = 0; i < l; i++)
  {
    if (this[i] == obj) return true;
  }
  return false;
};

注意,我正在缓存length值,因为Array的length属性实际上是一个访问器,这比内部变量稍微慢一些。

我知道这是一个老帖子,但我想提供一个JQuery插件版本和我的代码。

// Find the first occurrence of object in list, Similar to $.grep, but stops searching 
function findFirst(a,b){
var i; for (i = 0; i < a.length; ++i) { if (b(a[i], i)) return a[i]; } return undefined;
}

用法:

var product = $.findFirst(arrProducts, function(p) { return p.id == 10 });

你也可以使用findIndex

var carBrands = []; Var car1 = {name:'ford'}; Var car2 = {name:'lexus'}; carBrands.push (car1); 如果(carBrands。findIndex(f => f.name == car1.name) === -1) { console.log(不包含) }其他{ console.log(包含) } 如果(carBrands。findIndex(f => f.name == car2.name) === -1) { console.log(不包含) }其他{ console.log(包含) }

这个函数用来检查一个唯一的字段。 参数1:包含选定数据的数组 参数2:要检查的键 参数3:必须“验证”的值

function objectUnique( array, field, value )
{
    var unique = true;
    array.forEach(function ( entry )
    {
        if ( entry[field] == value )
        {
            unique = false;
        }
    });

    return unique;
}