Как проверить, содержит ли массив объект в JavaScript? - PullRequest
3588 голосов
/ 26 октября 2008

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

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

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

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

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

Ответы [ 46 ]

0 голосов
/ 15 декабря 2018
function countArray(originalArray) {

    var compressed = [];
    // make a copy of the input array
    var copyArray = originalArray.slice(0);

    // first loop goes over every element
    for (var i = 0; i < originalArray.length; i++) {

        var count = 0;  
        // loop over every element in the copy and see if it's the same
        for (var w = 0; w < copyArray.length; w++) {
            if (originalArray[i] == copyArray[w]) {
                // increase amount of times duplicate is found
                count++;
                // sets item to undefined
                delete copyArray[w];
            }
        }

        if (count > 0) {
            var a = new Object();
            a.value = originalArray[i];
            a.count = count;
            compressed.push(a);
        }
    }

    return compressed;
};

// It should go something like this:

var testArray = new Array("dog", "dog", "cat", "buffalo", "wolf", "cat", "tiger", "cat");
var newArray = countArray(testArray);
console.log(newArray);
0 голосов
/ 29 октября 2018

В дополнение к тому, что сказали другие, если у вас нет ссылки на объект, который вы хотите найти в массиве, то вы можете сделать что-то вроде этого.

let array = [1, 2, 3, 4, {"key": "value"}];

array.some((element) => JSON.stringify(element) === JSON.stringify({"key": "value"})) // true

array.some((element) => JSON.stringify(element) === JSON.stringify({})) // true

Array.some возвращает true, если какой-либо элемент соответствует данному условию, и возвращает false, если ни один из элементов не соответствует данному условию.

0 голосов
/ 10 октября 2018

Простое решение: ES6 Особенности " включает метод "

let arr = [1, 2, 3, 2, 3, 2, 3, 4];

  arr.includes(2) // true

  arr.includes(93) // false
0 голосов
/ 02 августа 2017

Использование idnexOf () - это хорошее решение, но вы должны скрыть встроенную реализацию indexOf (), которая возвращает -1 с помощью оператора ~:

function include(arr,obj) { 
    return !!(~arr.indexOf(obj)); 
} 
0 голосов
/ 10 мая 2011

Дословно:

(с использованием Firefox v3.6, с for-in оговорками, как отмечалось ранее (ОДНАКО приведенное ниже использование может поддерживать for-in именно для этой цели! То есть перечислять элементы массива, которые НАСТОЯТЕЛЬНО существуют через индекс свойства (ОДНАКО, в частности, свойство array 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' );

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

0 голосов
/ 04 августа 2010

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

// 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 и вызвать непредвиденное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...