Как проверить, содержит ли массив объект в JavaScript?

Какой самый краткий и эффективный способ выяснить, содержит ли массив JavaScript объект?

Это единственный способ, которым я знаю, чтобы сделать это:

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

Есть ли лучший и более краткий способ сделать это?

Это очень тесно связано с вопросом переполнения стека. Лучший способ найти элемент в массиве JavaScript? который обращается к поиску объектов в массиве, используя indexOf,

63 ответа

Самый быстрый способ в Javascript определить, содержит ли массив значение:

      function existsInArrayForIgnoreDataType(arr, targetElem) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == targetElem) return true
  }
  return false
 }

Вы можете найти полное исследование, которое я провел здесь .

В прямом смысле:

(используя Firefox v3.6, с for-in предостережения, как уже отмечалось ранее (ОДНАКО for-in для этой цели! То есть перечисление элементов массива, которые фактически существуют через индекс свойства (ОДНАКО, в частности, массив length свойство НЕ перечислено в for-in список свойств!).).)

(Перетащите следующие полные URI для немедленного тестирования браузера в режиме.)

JavaScript:

  function ObjInRA(ra){var has=false; for(i in ra){has=true; break;} return has;}

  function check(ra){
      return ['There is ',ObjInRA(ra)?'an':'NO',' object in [',ra,'].'].join('')
  }
  alert([
            check([{}]), check([]), check([,2,3]),
            check(['']), '\t (a null string)', check([,,,])
        ].join('\n'));

который отображает:

There is an object in [[object Object]].
There is NO object in [].
There is an object in [,2,3].
There is an object in [].
     (a null string)
There is NO object in [,,].

Морщины: если вы ищете "конкретный" объект, подумайте:

JavaScript: alert({}!={}); alert({}!=={});

И поэтому:

JavaScript:

 obj = {prop:"value"}; 
 ra1 = [obj]; 
 ra2 = [{prop:"value"}];
 alert(ra1[0] == obj); 
 alert(ra2[0] == obj);

Часто ra2 считается "содержать" obj как буквальная сущность {prop:"value"},

Очень грубое, элементарное, наивное (как в коде необходимо повышение квалификации) решение:

JavaScript:

  obj={prop:"value"};   ra2=[{prop:"value"}];
  alert(
    ra2 . toSource() . indexOf( obj.toSource().match(/^.(.*).$/)[1] ) != -1 ?
      'found' :
      'missing' );

См. Ref: Поиск объектов в массивах JavaScript.

Просто еще один вариант

// usage: if ( ['a','b','c','d'].contains('b') ) { ... }
Array.prototype.contains = function(value){
    for (var key in this)
        if (this[key] === value) return true;
    return false;
}

Будьте осторожны, поскольку перегрузка объектов массива javascript пользовательскими методами может нарушить поведение других javascript и вызвать непредвиденное поведение.

Другие вопросы по тегам