JavaScript-эквивалент PHP in_array ()

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

Как и PHP-функция in_array ?

Solutions Collecting From Web of "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; }