JavaScript эквивалент PHP в массиве()
есть ли способ в JavaScript сравнить значения из одного массива и посмотреть, находится ли он в другом массиве?
похоже на PHP in_array
17 ответов:
нет, у него его нет. По этой причине большинство популярных библиотек поставляются с одним в своих пакетах утилит. Проверьте jQuery в inArray и прототипа массив.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; }если вы имеете дело с разумным количеством элементов массива выше будет делать трюк красиво.
EDIT: Выкрикивает. Я даже не заметил, что вы хотели посмотреть, был ли массив внутри другого. Согласно документации 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код, опубликованный Крисом и Алексом, не соответствует этому поведению. Алекс-это официальная версия 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.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; }; }есть даже несколько полезных сниппетов для вашего удовольствия сценариев.
Теперь есть
Array.prototype.includes:включает в себя() метод определяет, является ли массив содержит определенный элемент, возвращающий true или false по мере необходимости.
var a = [1, 2, 3]; a.includes(2); // true a.includes(4); // falseсинтаксис
arr.includes(searchElement) arr.includes(searchElement, fromIndex)
Если индексы не находятся в последовательности, или если индексы не являются последовательными, код в других решениях, перечисленных здесь, сломается. Решение, которое будет работать несколько лучше, может быть:
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; }
есть проект под названием Locutus, он реализует функции PHP в Javascript и in_array () включен, вы можете использовать его точно так же, как вы используете в PHP.
пример использования:
in_array('van', myArray); in_array(1, otherArray, true); // Forcing strict type
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;
решение jQuery доступно, проверьте ducumentation здесь: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Если вы хотите только проверить, если одно значение находится в массиве, то код Паоло будет делать эту работу. Если вы хотите проверить, какие значения являются общими для обоих массивов, то вы хотите что-то вроде этого (используя функцию Паоло inArray):
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; }этот Wil возвращает массив значений, которые находятся в обоих
aиb. (Математически, это пересечение из двух массивов.)EDIT: посмотреть отредактированный код Паоло для решения вашей проблемы. :)
Если вам нужно все PHP доступные параметры, используйте это:
function in_array(needle, haystack, argStrict) { var key = '', strict = !!argStrict; if (strict) { for (key in haystack) { if (haystack[key] === needle) { return true; } } } else { for (key in haystack) { if (haystack[key] == needle) { return true; } } } return false; }
добавьте этот код в проект и используйте методы 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");
С Dojo Toolkit, вы должны использовать
dojo.indexOf(). Смотрите додзе.indexOf для документации, и Массивы Легко Брайан Форбс для некоторых примеров.
есть эквивалентная функция:
includes()посмотреть здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
function in_array(what, where) { var a=false; for (var i=0; i<where.length; i++) { if(what == where[i]) { a=true; break; } } return a; }
Я нашел отличное решение jQuery здесь так.
var success = $.grep(array_a, function(v,i) { return $.inArray(v, array_b) !== -1; }).length === array_a.length;Я хочу, чтобы кто-то опубликовал пример того, как это сделать в подчеркивании.
в эквиваленте
in_arrayсunderscoreи _.indexOfпримеры:
_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found
Если вы собираетесь использовать его в классе, и если вы предпочитаете, чтобы он был функциональным (и работать во всех браузерах):
inArray: function(needle, haystack) { var result = false; for (var i in haystack) { if (haystack[i] === needle) { result = true; break; } } return result; }надеюсь, что это поможет кому-то: -)
Comments