Есть ли способ в JavaScript для сравнения значений из одного массива и посмотреть, находится ли он в другом массиве?
Похоже на in_array
функцию PHP ?
Есть ли способ в JavaScript для сравнения значений из одного массива и посмотреть, находится ли он в другом массиве?
Похоже на in_array
функцию PHP ?
Ответы:
Нет, его нет. По этой причине большинство популярных библиотек поставляются с одной в своих пакетах утилит. Посмотрите jQuery inArray и Prototype 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, так как это обычно плохая идея.
indexOf
w3schools.com/jsref/jsref_indexof_array.asp
Есть сейчас Array.prototype.includes
:
Метод include () определяет, включает ли массив определенный элемент, возвращая в зависимости от ситуации true или false.
var a = [1, 2, 3];
a.includes(2); // true
a.includes(4); // false
Синтаксис
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
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;
};
}
Есть даже несколько удобных фрагментов использования для вашего удовольствия от написания сценариев.
this.length >>> 0
? Это преобразование в тип Number?
Array.indexOf
в настоящее время стандартизирован ECMAScript Fifth Edition, поэтому его следует рассматривать как «родной» способ сделать это. Тем не менее, вам все равно нужно будет прослушивать и предоставлять эту резервную копию для старого браузера в течение длительного времени. @harto: да, он преобразуется this.length
в число, которое может быть представлено как 32-разрядное целое число без знака. Нативная Array
может иметь только длину, которая уже соответствует этому, но спецификация утверждает, что вы можете вызывать Array.prototype
методы для объектов нативной JS, которые не являются Array
. Этот и другие педантичные средства проверки аргументов должны гарантировать абсолютное соответствие спецификациям.
Если индексы не в последовательности или индексы не являются последовательными, код в других решениях, перечисленных здесь, сломается. Решение, которое будет работать несколько лучше, может быть:
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
Вы можете просто использовать функцию «включает», как описано в этом уроке на w3schools
это выглядит как
let myArray = ['Kevin', 'Bob', 'Stuart'];
if( myArray.includes('Kevin'))
console.log('Kevin is here');
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, проверьте документацию здесь: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Есть эквивалентная функция:
includes()
Посмотрите здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Если вы хотите проверить, есть ли одно значение в массиве, то код 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
. (Математически это пересечение двух массивов.)
РЕДАКТИРОВАТЬ: См . Отредактированный код Паоло для решения вашей проблемы. :)
Если вам нужны все доступные параметры 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()
. См. Dojo.indexOf для документации и Arrays Made Easy от Bryan Forbes для некоторых примеров.
haystack.find(value => value == needle)
где стог сена - это массив, а игла - элемент в массиве. Если элемент не найден, будет возвращено неопределенное, иначе тот же элемент.
Если вы собираетесь использовать его в классе и предпочитаете, чтобы он был функциональным (и работал во всех браузерах):
inArray: function(needle, haystack)
{
var result = false;
for (var i in haystack) {
if (haystack[i] === needle) {
result = true;
break;
}
}
return result;
}
Надеюсь, это кому-нибудь поможет :-)
jQuery.inArray()
ничего не возвращают логическое значение. Возвращает индекс найденного элемента или -1, если не найден