Как проверить, содержит ли массив объект в 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 и вызвать непредвиденное поведение.