Kako v javascriptu preverim, ali polje vsebuje vrednost?

Kateri je najbolj jedrnat in učinkovit način za ugotavljanje, ali polje JavaScripta vsebuje vrednost?

To je edini način, ki ga poznam:

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

Ali obstaja boljši in bolj jedrnat način za to?

To je zelo tesno povezano z vprašanjem Stack Overflow Najboljši način iskanja elementa v polju JavaScript?, ki obravnava iskanje predmetov v polju z uporabo indexOf.

Posodobitev iz leta 2019: Ta odgovor je iz leta 2008 (star 11 let!) in ni relevanten za sodobno uporabo JS. Obljubljeno izboljšanje zmogljivosti je temeljilo na primerjalni analizi, opravljeni v takratnih brskalnikih. Za sodobne kontekste izvajanja JS morda ni relevantno. Če potrebujete enostavno rešitev, poiščite druge odgovore. Če potrebujete najboljšo zmogljivost, sami opravite primerjalno testiranje v ustreznih izvajalnih okoljih.

Kot so povedali drugi, je iteracija skozi polje verjetno najboljši način, vendar je bilo dokazano, da je padajoča zanka while najhitrejši način iteracije v jeziku JavaScript. Zato boste morda želeli kodo prepisati na naslednji način:

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

Seveda lahko tudi razširite prototip Array:

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

In zdaj lahko preprosto uporabite naslednje:

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

indexOf morda, vendar je to "razširitev standarda ECMA-262 v jeziku JavaScript; kot taka morda ni prisotna v drugih izvedbah standarda."

Primer:

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

AFAICS Microsoft ne ponuja alternative za to, vendar lahko podobno funkcionalnost dodate poljem v Internet Explorerju (in drugih brskalnikih, ki ne podpirajo indexOf), če želite, kot razkrije hitro iskanje v Googlu (na primer ta).

Komentarji (4)

Če uporabljate JavaScript 1.6 ali novejši (Firefox 1.5 ali novejši), lahko uporabite Array.indexOf. V nasprotnem primeru boste dobili nekaj podobnega kot v prvotni kodi.

Komentarji (0)