У меня есть следующее Array
, select
содержащее идентификаторы таблицы:
var arreglo = ["1", "2", "4", "5"]
Я хочу знать, "3"
содержится ли он в arreglo
. В Python это можно сделать:
>>> arreglo = ['1', '2', '4', '5']
>>> '3' in arreglo
False
Но попробовав это из консоли в JavaScript, вы удивитесь, что это не работает так же:
> var arreglo = ["1", "2", "4", "5"]
> "3" in arreglo
true
Проведя некоторое исследование документации MDN , я обнаружил проблему (выделено мной):
Оператор
in
возвращает true, если указанное свойство найдено в указанном объекте.
Действительно, arreglo
у него есть свойство (или индекс) "3"
, поэтому он возвращает меня true
:
> Object.keys(arreglo)
["0", "1", "2", "3"]
Мой вопрос, как я могу проверить, что объект содержится в массиве?
Вы можете использовать функцию
indexOf
классаArray
, которая возвращает позицию, в которой находится искомый объект.Возвращает
-1
, если он не существует, и в противном случае позицию, которая будет больше или равна0
.Вы можете использовать простой скрипт, например:
Хотя, исходя из вашего вопроса
¿Cómo saber si un objeto está contenido en un array?
, для меня объект будет, например:Теперь, чтобы определить, существует ли объект, это
"b"
будет:Но, как вы комментируете, для меня также было бы достаточно использовать только метод indexOf() :
arreglo.indexOf('3') > -1
Проведя некоторое исследование MDN, есть метод,
Array.prototype.includes()
предложенный для EcmaScript 2016 (ES7), и он возвращает логическое значение, если массив содержит указанный элемент:Этот метод принимает необязательный второй параметр, указывающий, по какому индексу будет выполняться поиск (0 по умолчанию).
Пока официально не известно, что этот метод будет присутствовать в следующей версии JavaScript, но если это так, этот ответ будет более актуальным, и я думаю, что это хорошее дополнение к массивам, потому что оно позволяет нам четко выразить наше намерение, которое производит более читаемый код. На данный момент есть возможность протестировать его в последних версиях самых распространенных браузеров, кроме IE и Edge (что удивительно).
В официальной документации мы находим следующий полифилл :
Если вас не волнует совместимость с браузерами IE6, 7 или 8, вы можете просто использовать use
indexOf
, как указано в первом ответе.Теперь, если вам нужна совместимость с «историческими» браузерами, вы можете реализовать
indexOf
это самостоятельно. Следующий код можно безопасно добавить в ваш код, поскольку, еслиindexOf
он определен, он не имеет никакого эффекта:Примечание: эта реализация
indexOf
была первоначально опубликована Дэниелом Джеймсом .Учитывая, что имеем:
Решение 1 — родное
У нас есть следующая функция и документация Array.prototype.indexOf() :
Практическое использование:
Решение 2. Использование библиотек
Мы можем использовать сторонние инструменты для достижения этого результата, такие как:
- Использование jQuery
Документация по jQuery.inArray () :
Практическое использование:
- Использование Underscore.js
Документация для _.indexOf() :
Практическое использование: