Чи існує спосіб у JavaScript порівняти значення з одного масиву та побачити, чи є він в іншому масиві?
Схожа на in_array
функцію PHP ?
Чи існує спосіб у JavaScript порівняти значення з одного масиву та побачити, чи є він в іншому масиві?
Схожа на in_array
функцію PHP ?
Відповіді:
Ні, його немає. З цієї причини найпопулярніші бібліотеки поставляються з такою у своїх утилітах. Перевірте JQuery в 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
Код, опублікований Крісом та Алексом, не відповідає цій поведінці. Алекс є офіційною версією прототипу 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
Зауважте, що я навмисно не поширював прототип масиву, оскільки це, як правило, погана ідея.
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
? Це перетворення на тип числа?
Array.indexOf
тепер стандартизована п'ятим виданням ECMAScript, тому слід вважати правильним "рідним" способом цього робити. Однак вам все одно доведеться нюхати та надавати цю резервну копію для старих веб-переглядачів. @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's 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
Якщо ви хочете лише перевірити, чи є одне значення в масиві, тоді код Паоло виконає цю роботу. Якщо ви хочете перевірити, які значення є спільними для обох масивів, вам потрібно щось подібне (використовуючи функцію 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 ви користуєтесь dojo.indexOf()
. Дивіться dojo.indexOf для документації, а також Брайан Форбс для деяких прикладів Arrays Made Easy .
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, якщо його не знайдено