Проверка дали даден елемент присъства в масив

Функцията, която използвам сега, за да проверя това, е следната:

function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}

Тя работи. Това, което търся, е дали има по-добър начин да се направи това.

Код:

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
Коментари (7)

Просто използвайте indexOf:

haystack.indexOf(needle) >= 0

Ако искате да поддържате старите Internet Explorers (< IE9), ще трябва да включите текущия си код като заобиколен вариант, въпреки че.

Освен ако списъкът ви не е сортиран, трябва да сравнявате всяка стойност с иглата. Следователно както вашето решение, така и indexOf ще трябва да изпълняват средно по n/2 сравнения. Тъй като обаче indexOf е вграден метод, той може да използва допълнителни оптимизации и на практика ще бъде малко по-бърз. Обърнете внимание, че ако приложението ви не търси в списъци изключително често (например 1000 пъти в секунда) или списъците не са огромни (например 100 хил. записа), разликата в скоростта няма да има значение.

Коментари (6)

Можете да използвате функцията _contains от библиотеката underscore.js, за да постигнете това:

if (_.contains(haystack, needle)) {
  console.log("Needle found.");
};
Коментари (2)