Есть ли способ в JavaScript сравнить значения из одного массива и посмотреть, находится ли он в другом массиве?
Как и PHP-функция in_array
?
Нет, у него его нет. По этой причине большинство популярных библиотек поставляются с одним в своих пакетах служебных программ. В качестве примера рассмотрим 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; }
Если вы имеете дело с разумным количеством элементов массива, то выше будет делать трюк красиво.
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
Код, отправленный Крисом и Алексом, не соответствует этому поведению. Alex's – официальная версия IndexOf прототипа, а Chris больше похожа на 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, поскольку, как правило, это плохая идея.
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; }; }
Есть даже некоторые полезные фрагменты использования для вашего удовольствия от скриптов.
Если индексы не находятся в последовательности или индексы не являются последовательными, код в других решениях, перечисленных здесь, будет ломаться. Решение, которое будет работать несколько лучше, может быть:
function in_array(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return true; } return false; }
И, в качестве бонуса, вот эквивалент массива PHP_search (для нахождения ключа элемента в массиве:
function array_search(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return i; } return false; }
теперь есть Array.prototype.includes: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Метод includes () определяет, содержит ли массив некоторый элемент, возвращая true или false соответственно.
var a = [1, 2, 3]; a.includes(2); // true a.includes(4); // false
Синтаксис
arr.includes(searchElement) arr.includes(searchElement, fromIndex)
Существует проект 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 от 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; }
Этот wil возвращает массив значений, которые находятся как в a
и в b
. (Математически это пересечение двух массивов.)
EDIT: см . Редактированный код Paolo для решения вашей проблемы. 🙂
Если вам нужны все доступные параметры 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; }
С Dojo Toolkit вы должны использовать dojo.indexOf()
. См. Dojo.indexOf для документации и Массивы Made Easy от Bryan Forbes для некоторых примеров.
Добавьте этот код в проект и используйте методы 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");
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 здесь, на SO.
var success = $.grep(array_a, function(v,i) { return $.inArray(v, array_b) !== -1; }).length === array_a.length;
Я хотел бы, чтобы кто-то опубликовал пример того, как это сделать в подчеркивании.
Существует эквивалентная функция:
includes()
Смотрите здесь: https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/includes
Эквивалент 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; }
Надеюсь, это поможет кому-то 🙂
function in_array(needle, haystack){ return haystack.indexOf(needle) !== -1; }