JavaScript'te bir dizideki değerleri karşılaştırmanın ve başka bir dizide olup olmadığını görmenin bir yolu var mı?
PHP'nin in_array
fonksiyonuna benzer mi?
JavaScript'te bir dizideki değerleri karşılaştırmanın ve başka bir dizide olup olmadığını görmenin bir yolu var mı?
PHP'nin in_array
fonksiyonuna benzer mi?
Yanıtlar:
Hayır, bir tane yok. Bu nedenle, en popüler kütüphaneler kendi yardımcı paketlerinde bir tane ile gelir. JQuery'nin göz atın inArray ve Prototype'ın Array.indexOf örnekler için.
jQuery'nin uygulanması beklediğiniz kadar basittir:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Eğer dizi öğelerin aklı başında bir miktar ile uğraşıyorsanız, yukarıdaki hile güzel yapacak.
EDIT : Hata! Bir dizinin diğerinin içinde olup olmadığını görmek istediğinizi fark etmedim. PHP belgelerine göre bu PHP'nin beklenen davranışıdır 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
Chris ve Alex tarafından yayınlanan kod bu davranışı izlemez. Alex's, Prototype'in indexOf'sunun resmi sürümüdür ve Chris's daha çok PHP'ninki gibidir array_intersect
. İstediğinizi yapar:
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;
}
Ve bu benim yukarıdaki testim:
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 prototipini kasıtlı olarak genişletmediğime dikkat edin, çünkü bunu yapmak genellikle kötü bir fikirdir.
indexOf
w3schools.com/jsref/jsref_indexof_array.asp
Şimdi var Array.prototype.includes
:
İnclude () yöntemi, bir dizinin belirli bir öğeyi içerip içermediğini belirler ve uygun şekilde true veya false döndürür.
var a = [1, 2, 3];
a.includes(2); // true
a.includes(4); // false
Sözdizimi
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
Array.indexOf
JavaScript 1.6'da kullanılmaya başlandı, ancak eski tarayıcılarda desteklenmiyor. Neyse ki Mozilla'daki ahbaplar sizin için tüm zor işleri yaptı ve size uyumluluk için şunları sağladı:
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;
};
}
Senaryo keyfi için bazı kullanışlı kullanım snippet'leri bile var.
this.length >>> 0
nedir? Bu bir Sayı türüne dönüşüm mü?
Array.indexOf
şimdi ECMAScript Fifth Edition tarafından standartlaştırılmıştır, bu yüzden bunu yapmanın uygun 'doğal' yolu olarak düşünülmelidir. Yine de eski tarayıcı için bu yedeklemeyi uzun süre koklamanız ve sağlamanız gerekecektir. @harto: evet, this.length
32 bit işaretsiz tam sayı olarak gösterilebilen bir Sayıya dönüştürülür . Bir yerel Array
, yalnızca buna uygun bir uzunluğa sahip olabilir, ancak spec Array.prototype
, yerel olmayan JS nesnelerinde yöntem çağırabileceğinizi belirtir Array
. Bu ve diğer bilgiç argüman kontrolleri mutlak şartlara uyumu garanti etmektir.
Dizinler sıralı değilse veya dizinler ardışık değilse, burada listelenen diğer çözümlerde kod kesilir. Biraz daha iyi çalışacak bir çözüm şunlar olabilir:
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
Ve bir bonus olarak, PHP'nin array_search işlevine eşdeğerdir (dizideki öğenin anahtarını bulmak için:
function array_search(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return i;
}
return false;
}
Locutus adlı bir proje var, Javascript'te PHP fonksiyonlarını uyguluyor ve in_array () dahil, bunu tam olarak PHP'de kullandığınız gibi kullanabilirsiniz.
Kullanım örnekleri:
in_array('van', myArray);
in_array(1, otherArray, true); // Forcing strict type
W3schools ile ilgili bu derste anlatıldığı gibi "içerir" işlevini kullanabilirsiniz.
gibi görünüyor
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 çözümü mevcuttur, burada teçhizatı kontrol edin: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Eşdeğer bir işlev vardır:
includes()
Buraya bakın: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Bir dizide yalnızca tek bir değerin olup olmadığını kontrol etmek istiyorsanız, Paolo'nun kodu işi yapar. Her iki dizide de hangi değerlerin ortak olduğunu kontrol etmek istiyorsanız, böyle bir şey istersiniz (Paolo'nun inArray işlevini kullanarak):
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;
}
Bu hem a
ve değerlerinde bir dizi değer döndürür b
. (Matematiksel olarak, bu iki dizinin kesişimi .)
DÜZENLEME: Sorununuzun çözümü için Paolo'nun Düzenlenmiş Koduna bakın . :)
Mevcut tüm PHP parametrelerine ihtiyacınız varsa, bunu kullanın:
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;
}
Bu kodu projenize ekleyin ve nesne tarzı inArray yöntemlerini kullanın
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 ile kullanabilirsiniz dojo.indexOf()
. Belgeler için dojo.indexOf ve bazı örnekler için Bryan Forbes tarafından Kolaylaştırılan Diziler konusuna bakın .
haystack.find(value => value == needle)
burada samanlık bir dizidir ve iğne dizideki bir öğedir. Bulunamayan öğe tanımsız olarak döndürülürse aynı öğe döndürülür.
Bir sınıfta kullanacaksanız ve işlevsel olmasını (ve tüm tarayıcılarda çalışmayı) tercih ediyorsanız:
inArray: function(needle, haystack)
{
var result = false;
for (var i in haystack) {
if (haystack[i] === needle) {
result = true;
break;
}
}
return result;
}
Umarım birine yardımcı olur :-)
jQuery.inArray()
yok değil boolean dönün. Bulunan öğenin dizinini veya bulunamazsa -1 değerini döndürür