Koks yra glaustas ir efektyviausias būdas sužinoti, ar "JavaScript" masyve yra reikšmė?
Tai vienintelis man žinomas būdas:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Ar yra geresnis ir glaustesnis būdas tai padaryti?
Tai labai glaudžiai susiję su "Stack Overflow" klausimu Geriausias būdas rasti elementą "JavaScript" masyve?, kuriame kalbama apie objektų paiešką masyve naudojant indexOf
.
Atnaujinta 2019 m.: šis atsakymas yra 2008 m. (11 metų senumo!) ir nėra aktualus šiuolaikiniam JS naudojimui. Žadėtas našumo pagerėjimas buvo pagrįstas lyginamuoju testu, atliktu to meto naršyklėse. Jis gali būti netinkamas šiuolaikinėms JS vykdymo aplinkybėms. Jei jums reikia paprasto sprendimo, ieškokite kitų atsakymų. Jei jums reikia geriausio našumo, patys atlikite lyginamąją analizę atitinkamose vykdymo aplinkose.
Kaip sakė kiti, iteracija per masyvą tikriausiai yra geriausias būdas, tačiau buvo įrodyta, kad mažėjantis while
ciklas yra greičiausias būdas iteruoti "JavaScript". Todėl galite perrašyti savo kodą taip:
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Žinoma, taip pat galite išplėsti Array prototipą:
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
O dabar galite tiesiog naudoti:
alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
IndexOf
galbūt, bet tai "JavaScript ECMA-262 standarto išplėtimas; todėl jo gali nebūti kitose standarto realizacijose."
Pavyzdys:
[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1
AFAICS Microsoft nesiūlo jokios alternatyvos, tačiau, jei norite, galite pridėti panašų funkcionalumą prie masyvų Internet Explorer (ir kitose naršyklėse, kurios nepalaiko indexOf
), kaip rodo greita Google paieška (pvz., šis).
Jei naudojate "JavaScript 1.6" ar naujesnę versiją ("Firefox 1.5" ar naujesnę versiją), galite naudoti Array.indexOf. Priešingu atveju, manau, gausite kažką panašaus į savo pradinį kodą.