JavaScript'te bir dizinin bir değer içerip içermediğini nasıl kontrol edebilirim?

Bir JavaScript dizisinin bir değer içerip içermediğini bulmanın en kısa ve etkili yolu nedir?

Bunu yapmanın bildiğim tek yolu bu:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

Bunu başarmanın daha iyi ve daha kısa bir yolu var mı?

Bu, indexOf kullanarak bir dizideki nesneleri bulmayı ele alan Stack Overflow sorusu JavaScript Dizisindeki bir öğeyi bulmanın en iyi yolu? ile çok yakından ilgilidir.

2019'dan itibaren güncelleme: Bu yanıt 2008 yılına aittir (11 yaşında!) ve modern JS kullanımıyla ilgili değildir. Söz verilen performans iyileştirmesi, o zamanın tarayıcılarında yapılan bir kıyaslamaya dayanıyordu. Modern JS yürütme bağlamlarıyla ilgili olmayabilir. Kolay bir çözüme ihtiyacınız varsa, diğer yanıtlara bakın. En iyi performansa ihtiyacınız varsa, ilgili yürütme ortamlarında kendiniz için kıyaslama yapın.

Diğerlerinin de söylediği gibi, dizi boyunca yineleme muhtemelen en iyi yoldur, ancak JavaScript'te yineleme yapmanın en hızlı yolunun azalan `while' döngüsü olduğu kanıtlanmıştır. Bu yüzden kodunuzu aşağıdaki gibi yeniden yazmak isteyebilirsiniz:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

Elbette, Array prototipini de genişletebilirsiniz:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

Ve şimdi basitçe aşağıdakileri kullanabilirsiniz:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
Yorumlar (16)

indexOf olabilir, ancak bu bir "ECMA-262 standardına JavaScript uzantısıdır; bu nedenle standardın diğer uygulamalarında mevcut olmayabilir."

Örnek:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft buna bir tür alternatif sunmuyor, ancak hızlı bir Google aramasının ortaya koyduğu gibi isterseniz Internet Explorer'daki (ve `indexOf'u desteklemeyen diğer tarayıcılardaki) dizilere benzer işlevler ekleyebilirsiniz (örneğin, bu).

Yorumlar (4)

JavaScript 1.6 veya üstünü kullanıyorsanız (Firefox 1.5 veya üstü) Array.indexOf kullanabilirsiniz. Aksi takdirde, orijinal kodunuza benzer bir şeyle sonuçlanacağınızı düşünüyorum.

Yorumlar (0)