PHP'nin in_array () JavaScript eşdeğeri


224

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_arrayfonksiyonuna benzer mi?

Yanıtlar:


258

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.


1
jQuery.inArray()yok değil boolean dönün. Bulunan öğenin dizinini veya bulunamazsa -1 değerini döndürür
Brad Kent

Yüksek reyting nedeniyle - cevabınızı modası geçmiş olarak işaretlemelisiniz
Gerfried


74

Ş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)

66

Array.indexOfJavaScript 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.


Bu zaten burada yayınlanan bağlantılar / kod daha güzel / daha güvenli / daha iyi bir uygulama; teknik özellikler samanlık içindeki dizileri kontrol etmeye çağırmaz ve OP'nin istediği budur.
Paolo Bergantino

3
Bu arada, amacı this.length >>> 0nedir? Bu bir Sayı türüne dönüşüm mü?
harto

3
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.length32 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.
bobince

3
Doğrudan Mozilla'dan farklı bir
çoklu doldurma

@harto Yorumunuzdan 8 yıl sonra cevap veriyorum ama belki bir başkası aynı soruya sahip olabilir => bkz. stackoverflow.com/questions/1822350/…
Frosty Z

14

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;
}

Yerine güzel damla. Gerçekten php düğüme kolay taşıma yaptı. teşekkürler
Rahim Khoja

9

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

4
JQuery'nin API'lerinde bir inArray işlevi de vardır. Kontrol api.jquery.com/jQuery.inArray
ahPo

@ahPo, Güzel! Ancak Locutus uygulaması, bağımlılığı olmayan saf javascript olma avantajına sahiptir. Yani, ihtiyaçlarınız için en iyisini seçin
Marcio Mazzucato

1
veya gerekli işlevi Locutus'tan içe aktarabilirsiniz .
Niket Pathak


5
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;

5

jQuery çözümü mevcuttur, burada teçhizatı kontrol edin: http://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );

3
şöyle kontrol etmeyi unutmayın: if ($. inArray (10, [8, 9, 10, 11])> -1) çünkü bunu beğendim: if ($. inArray (10, [8, 9, 10, 11])) ve her zaman doğru döner
temirbek

Not: Bu tipe duyarlıdır, bu nedenle sayıları kontrol ederseniz veri türlerinizin eşleştiğinden emin olun! yani: $ .Array ('10', [8, 9, 10, 11]); -1
Oliver M Grech


3

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 ave 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 . :)


Bu güzel olmasına rağmen, OP'nin gerçekten istediği şey değil; PHP'nin in_array işlevlerini çoğaltmaz.
Paolo Bergantino

3

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;
}

3

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");


2
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.


1
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;
}

1

Burada SO büyük bir jQuery çözüm buldum .

var success = $.grep(array_a, function(v,i) {
    return $.inArray(v, array_b) !== -1;
}).length === array_a.length;

Birisi bunu alt çizgide nasıl yapılacağına dair bir örnek yayınlasaydı.


1
function in_array(needle, haystack){

    return haystack.indexOf(needle) !== -1;
}

Bu yalnızca dizideki ilk öğe olup olmadığını döndürür; eğer indexOf(needle) > 0o false dönecektir
DiMono

0

Bir eşdeğeri in_arrayile underscoreolan _.indexOf

Örnekler:

_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found


0

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 :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.