Функция, которую я сейчас использую для проверки, следующая:
function inArray(needle,haystack)
{
var count=haystack.length;
for(var i=0;i<count;i++)
{
if(haystack[i]===needle){return true;}
}
return false;
}
Она работает. Я хочу узнать, есть ли лучший способ сделать это.
В ECMAScript 2016 включает в себя включает()
метод для массивов, которая специально решает проблему, и поэтому является наиболее предпочтительным способом.
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(1, 2); // false (second parameter is the index position in this array at which to begin searching)
По состоянию на июль 2018, это осуществляется в почти всех основные браузеров, если вам нужна поддержка IE в полифилл есть в наличии.
Редактировать: обратите внимание, что это возвращает false, если элемент массива представляет собой объект. Это происходит потому, что подобные объекты являются двумя разными объектами в JavaScript.
Код:
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
Исполнение:
isInArray(1, [1,2,3]); // true
Обновление (2017):
В современных браузерах, которые следуют стандарту ECMAScript 2016 (ES7), можно использовать функцию Array.prototype.includes, которая значительно упрощает проверку наличия элемента в массиве:
const array = [1, 2, 3];
const value = 1;
const isInArray = array.includes(value);
console.log(isInArray); // true
Просто используйте indexOf
:
haystack.indexOf(needle) >= 0
Если вы хотите поддерживать старые Internet Explorer'ы (< IE9), вам'придется включить ваш текущий код в качестве обходного пути.
Если ваш список не отсортирован, вам нужно сравнить каждое значение с иглой. Поэтому и вашему решению, и indexOf
придется выполнить в среднем n/2
сравнений. Однако, поскольку indexOf
является встроенным методом, он может использовать дополнительные оптимизации и на практике будет немного быстрее. Обратите внимание, что если ваше приложение не ищет в списках очень часто (скажем, 1000 раз в секунду) или списки огромны (скажем, 100k записей), разница в скорости не будет иметь значения.
Я сопоставив ее несколько раз на Гугл Хром 52, но не стесняйтесь, чтобы скопировать его в любой другой браузер'с консоли.
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);
function inArray(target, array)
{
/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */
for(var i = 0; i < array.length; i++)
{
if(array[i] === target)
{
return true;
}
}
return false;
}
var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;
var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);
Одной строки кода.. будет возвращать true или false
!!(arr.indexOf("val")+1)
Вы можете использовать помощи indexOf
, но не работает в последней версии интернет-обозревателя.
Код:
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
Исполнение:
isInArray(1, [1,2,3]); // true
Я предлагаю вам использовать следующий код:
function inArray(needle, haystack) {
var length = haystack.length;
for (var i = 0; i < length; i++) {
if (haystack[i] == needle)
return true;
}
return false;
}
Для этого можно использовать функцию _contains из библиотеки underscore.js:
if (_.contains(haystack, needle)) {
console.log("Needle found.");
};
С ECMAScript6, можно использовать комплект :
var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
В зависимости от размера иглы вы'вновь ищет массива .фильтр
может быть полезным. Здесь'ы пример:
let filtered, arr = ['Haystack', 'Needle'];
filtered = arr.filter((elem) => {
return elem.toLowerCase() === 'needle';
});
// filtered => ['needle']
В лодашь вы можете использовать _.включает (который также псевдонимы _.содержит)
Вы можете искать весь массив:
_.includes([1, 2, 3], 1); // true
Вы можете искать массива от начального индекса:
_.includes([1, 2, 3], 1, 1); // false (begins search at index 1)
Поиск по строке:
_.includes('pebbles', 'eb'); // true (string contains eb)
Также работает для проверки простых массивов объектов:
_.includes({ 'user': 'fred', 'age': 40 }, 'fred'); // true
_.includes({ 'user': 'fred', 'age': false }, false); // true
Одна вещь, чтобы отметить о последнем случае это работает для примитивов вроде строками, числами и логическими значениями, но не могу найти через массивы или объекты
_.includes({ 'user': 'fred', 'age': {} }, {}); // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3); // false