JavaScript-эквивалент PHP in_array () - PullRequest
194 голосов
/ 24 апреля 2009

Есть ли в JavaScript способ сравнить значения из одного массива и посмотреть, находится ли он в другом массиве?

Похоже на PHP in_array функция?

Ответы [ 17 ]

242 голосов
/ 24 апреля 2009

Нет, у него его нет. По этой причине большинство популярных библиотек поставляются с одной в своих пакетах утилит. Посмотрите jQuery's inArray и Прототип * Array.indexOf для примеров.

Реализация jQuery настолько проста, насколько вы можете ожидать:

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

Если вы имеете дело с нормальным количеством элементов массива, вышеприведенное хорошо сработает.

РЕДАКТИРОВАТЬ : Упс. Я даже не заметил, что вы хотели увидеть, был ли массив внутри другого. Согласно документации PHP, это ожидаемое поведение PHP in_array:

$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was found\n";
}

if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found\n";
}

if (in_array('o', $a)) {
    echo "'o' was found\n";
}

// Output:
//  'ph' was found
//  'o' was found

Код, опубликованный Крисом и Алексом, не соответствует этому поведению. Алекс - это официальная версия Prototype indexOf, а Крис больше похож на PHP array_intersect. Это делает то, что вы хотите:

function arrayCompare(a1, a2) {
    if (a1.length != a2.length) return false;
    var length = a2.length;
    for (var i = 0; i < length; i++) {
        if (a1[i] !== a2[i]) return false;
    }
    return true;
}

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

А это мой тест из вышеперечисленного на нем:

var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
    alert('ph was found');
}
if(inArray(['f','i'], a)) {
    alert('fi was found');
}
if(inArray('o', a)) {
    alert('o was found');
}  
// Results:
//   alerts 'ph' was found
//   alerts 'o' was found

Обратите внимание, что я намеренно не расширил прототип Array, так как это обычно плохая идея.

65 голосов
/ 24 апреля 2009

Array.indexOf была введена в JavaScript 1.6, но она не поддерживается в старых браузерах. К счастью, ребята из Mozilla сделали всю тяжелую работу для вас и предоставили вам это для совместимости:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

Есть даже несколько удобных фрагментов использования для вашего удовольствия от написания скриптов.

39 голосов
/ 21 ноября 2016

Сейчас есть Array.prototype.includes:

Метод includes () определяет, содержит ли массив определенный элемент, возвращающий true или false в зависимости от ситуации.

var a = [1, 2, 3];
a.includes(2); // true 
a.includes(4); // false

Синтаксис

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
14 голосов
/ 06 августа 2011

Если индексы не в последовательности или индексы не являются последовательными, код в других решениях, перечисленных здесь, сломается. Решение, которое будет работать несколько лучше, может быть:

function in_array(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

И, в качестве бонуса, вот эквивалент PHP array_search (для нахождения ключа элемента в массиве:

function array_search(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return i;
    }
    return false;
}
9 голосов
/ 08 июня 2012

Существует проект под названием Locutus , он реализует функции PHP в Javascript и in_array () , вы можете использовать его точно так же, как в PHP.

Примеры использования:

in_array('van', myArray);

in_array(1, otherArray, true); // Forcing strict type
5 голосов
/ 26 декабря 2014

Доступно решение jQuery, проверьте документацию здесь: http://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );
4 голосов
/ 24 мая 2013
var a = [1,2,3,4,5,6,7,8,9];

var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;

var isSixInArray = a.indexOf(6)>=0;
3 голосов
/ 30 сентября 2017

Есть эквивалентная функция:

includes()

Смотрите здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

3 голосов
/ 24 марта 2016

Добавьте этот код в свой проект и используйте методы inArray в стиле объекта

if (!Array.prototype.inArray) {
    Array.prototype.inArray = function(element) {
        return this.indexOf(element) > -1;
    };
} 
//How it work
var array = ["one", "two", "three"];
//Return true
array.inArray("one");
3 голосов
/ 24 апреля 2009

Если вы хотите проверить, есть ли одно значение в массиве, тогда код Paolo выполнит эту работу. Если вы хотите проверить, какие значения являются общими для обоих массивов, вам понадобится что-то вроде этого (с помощью функции inArray от Paolo):

function arrayIntersect(a, b) {
    var intersection = [];

    for(var i = 0; i < a.length; i++) {
        if(inArray(b, a[i]))
            intersection.push(a[i]);
    }

    return intersection;
}

Это вернет массив значений как a, так и b. (Математически это пересечение двух массивов.)

РЕДАКТИРОВАТЬ: См. Отредактированный код Паоло для решения вашей проблемы. :)

...