Дополнительно
Как проверить, включает ли массив значение в JavaScript?
Каков наиболее краткий и эффективный способ выяснить, содержит ли массив JavaScript значение?
Это единственный известный мне способ:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Есть ли лучший и более лаконичный способ сделать это?
Это очень тесно связано с вопросом Stack Overflow Best way to find an item in a JavaScript Array?, который касается поиска объектов в массиве с помощью indexOf
.
3744
20
Современные браузеры имеют
Array#includes
, который делает точно это, широко поддерживается и имеет polyfill для старых браузеров.Вы также можете использовать
Array#indexOf
, который является менее прямым, но не требует полифилла для устаревших браузеров.jQuery предлагает
$.inArray
, который функционально эквивалентенArray#indexOf
.underscore.js, библиотека утилит JavaScript, предлагает
_.contains(list, value)
, псевдоним_.include(list, value)
, оба из которых используют indexOf внутренне, если передается массив JavaScript.Некоторые другие фреймворки предлагают похожие методы:
dojo.indexOf(array, value, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
array.indexOf(value)
Ext.Array.contains(array, value)
_.includes(array, value, [from])
(является_.contains
до версии 4.0.0)R.includes(value, array)
array.includes(value)
.Обратите внимание, что некоторые фреймворки реализуют это как функцию, а другие добавляют функцию к прототипу массива.
Обновление от 2019 года: Этот ответ был дан в 2008 году (11 лет назад!) и не является актуальным для современного использования JS. Обещанное улучшение производительности было основано на бенчмарке, проведенном в браузерах того времени. Это может быть неактуально для современных контекстов выполнения JS. Если вам нужно простое решение, ищите другие ответы. Если вам нужна лучшая производительность, проведите сравнительный анализ в соответствующих средах исполнения.
Как уже говорили другие, итерация по массиву, вероятно, лучший способ, но было доказано, что убывающий цикл
while
является самым быстрым способом итерации в JavaScript. Поэтому вы можете переписать свой код следующим образом:Конечно, вы также можете расширить прототип Array:
И теперь вы можете просто использовать следующее:
indexOf
возможно, но это "расширение JavaScript для стандарта ECMA-262; как таковое оно может отсутствовать в других реализациях стандарта"Пример:
AFAICS Microsoft не предлагает нет альтернативы этому, но вы можете добавить подобную функциональность к массивам в Internet Explorer (и других браузерах, которые не поддерживают
indexOf
), если захотите, как показывает быстрый поиск в Google (например, этот).В ECMAScript 7 вводит
массива.прототип.включает
.Он может быть использован такой:
Он также принимает fromindex полагается равным необязательный второй аргумент``:
В отличие от
помощи indexOf
, который использует строгая сравнения,включает
сравнивает используя SameValueZero алгоритм равенства. Это означает, что вы можете обнаружить, если массив включает в себяНана
:Также в отличие от
помощи indexOf
,включает в себя
не пропустите недостающие показатели:В настоящее время это's все еще проект, но может быть polyfilled, чтобы заставить его работать на всех браузерах.
B
- это значение, иA
- это массив. Он возвращаетtrue
илиfalse
:Лучшие ответы считать примитивных типов, но если вы хотите узнать, если массив содержит объекта с какая-то черта, массив.прототип.некоторые() - это очень элегантное решение:
Хорошая вещь об этом состоит в том, что итерация прерывается, как только элемент найден так лишних циклов итерации не пощадят.
Кроме того, он прекрасно вписывается в
если
заявление, поскольку оно возвращает логическое значение:* Как jamess указал в комментарии, на момент этого ответа, сентябрь 2018,
массива.прототип.некоторые()
полностью поддерживается: таблица поддержки caniuse.comЗдесь'ы код JavaScript совместимый 1.6 реализация
массива.метод indexOf
:Использование:
Расширяя объект в JavaScript массив-это очень плохая идея, поскольку вы добавляете новые свойства (пользовательские методы) в
-в
петли, которые могут нарушить работу существующих скриптов. Несколько лет назад авторы прототип библиотеки пришлось перестроить свою реализацию библиотеки, чтобы удалить только такого рода вещи.Если вы Don'т нужно беспокоиться о совместимости с другими JavaScript, выполняющийся на вашу страницу, пойти на это, иначе, я'd рекомендую тем более неудобно, но безопаснее отдельно стоящая функция решение.
Думать из коробки на второй, если вы делаете этот призыв много раз, это гораздо более эффективно использовать <удар>ассоциативный массив</удара> карты, выполнять поиск с использованием хэш-функции.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Один-лайнер:
Я использую следующие:
Array.prototype.some() был добавлен в ECMA-262 стандарт в 5-е издание
Надеюсь быстрее двунаправленный
помощи indexOf
/lastIndexOf
альтернатива2015
В то время как новый метод включает Очень приятно, поддержка практически нулевая сейчас.
Это'ы давно, что я думал о пути, чтобы заменить медленный метод indexOf/lastIndexOf функции.
Более производительный способ уже найден, глядя на лучшие ответы. Из тех, кого я выбрал
содержит функции
сообщение от @Дамир zekic в который должен быть самым быстрым. Но в нем также говорится, что показатели с 2008 года и так устарели.Я тоже предпочитаю
а
заза
, но не конкретная причина, я закончил писать функцию с помощью цикла for. Это может быть также сделано сВремя...
.Мне было любопытно, если итерации было значительно медленнее, если я проверю обе стороны массива, а делать это. Видимо, нет, и поэтому эта функция находится примерно в два раза быстрее, чем в верхней голосования. Очевидно, что это's также быстрее, чем родной. Это в реальных условиях, где вы никогда не знаете, если значение, которое вы ищете находится в начале или в конце массива.
Когда вы знаете, вы просто толкнул массив со значением, используя lastIndexOf остается, пожалуй, лучшее решение, но если вам надо пройти через большие массивы и результат может быть везде, это может быть твердый раствор, чтобы сделать вещи быстрее.
Двунаправленный метод indexOf/lastIndexOf
Тест производительности
http://jsperf.com/bidirectionalindexof
В качестве теста я создал массив с 100к записей.
Три запроса: в начале, в середине & в конце массива.
Я надеюсь, вы найдете это интересным и тестирования производительности.
Примечание: как вы видите, я немного изменил
содержит
чтобы отразить метод indexOf &ампер; выход lastIndexOf (так в основномистинный
синдекс
иfalse
на-1
). Что должно'т повредить его.Прототип массива вариант
Функция также может быть легко изменен, чтобы возвращать true или false или даже объект, строка или что бы это ни было.
И вот это
пока
вариант:Как это возможно?
Я думаю, что простой расчет, чтобы получить отраженный индекс в массиве это так просто, что это's два раза быстрее, чем делать реальное итерации цикла.
Вот сложный пример делает три проверки на каждой итерации, но это возможно только с более длительный расчет, который вызывает замедление кодекса.
http://jsperf.com/bidirectionalindexof/2
Индекс возвращает массив, если нашли, или -1, если не найден
Если вы используете JavaScript 1.6 или более позднюю версию (Firefox 1.5 или более позднюю версию), вы можете использовать Array.indexOf. В противном случае, я думаю, вы получите что-то похожее на ваш исходный код.
Если вы регулярно проверяете на существование объекта в массив, вам стоит заглянуть в
Мы используем этот фрагмент (работает с объектами, массивами, строками):
Использование:
Решение, которое работает во всех современных браузерах:
Использование:
Решение ИЕ6+:
Использование:
Зачем использовать формат JSON.преобразовать в строки`?
Массива.помощи indexOf
и `массива.включает в себя (как и большинство ответов здесь) сравнивать только по ссылке и не по значению.Бонус
Неоптимизированный ES6 в один-лайнер:
Примечание: Сравнение объектов по значению будет лучше работать, если ключи находятся в том же порядке, так, чтобы быть безопасным вы можете сортировать ключи пакет вроде этого: https://www.npmjs.com/package/sort-keys
Обновленная функция
содержит
с перф оптимизации. Спасибо itinance для указания.Использовать lodash'ы некоторые функция.
Это'ы краткое, точное и имеет большое кросс-платформенную поддержку.
Принято отвечать даже не отвечают требованиям.
Требования: рекомендовать наиболее кратким и эффективным способом для того, чтобы найти JavaScript-массив содержит объект.
Принято Отвечать:
Моя рекомендация:
Примечания:
$.inArray хорошо работает для определения того, является ли скаляр значение существует в массиве скаляров...
... но вопрос явно просит для эффективный способ определить, если объект ** содержится в массиве.
Для того, чтобы обрабатывать оба скаляры и объекты, вы могли бы сделать это: