Kaip patikrinti, ar masyvas turi objektą javascript'e?

Kas yra glaustiausias ir efektyviausias būdas sužinoti, ar masyvas turi „JavaScript“ objektą?

Tai vienintelis būdas, kaip aš jį žinau:

 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 kamino perpildymo problema - geriausias būdas rasti elementą „JavaScript“ masyve? kuris yra skirtas objektų indexOf masyve naudojant indexOf .

3446
26 окт. nustatė bradas 26 d. 2008-10-26 01:14 '08 ne 1:14 2008-10-26 01:14
@ 44 atsakymai
  • 1
  • 2

Šiuo metu naršyklėse yra „ Array#includes , kas yra plačiai palaikoma ir turi senesnes naršykles.

 > ['joe', 'jane', 'mary'].includes('jane'); true 

Taip pat galite naudoti „ Array#indexOf , kuri yra mažiau tiesioginė, bet nereikalauja pasenusių naršyklių „ Array#indexOf .

jQuery siūlo $.inArray , kuris yra funkciniu požiūriu lygiavertis „ Array#indexOf .

„Underscore.js“ , „JavaScript“ programinės įrangos biblioteka, siūlo _.contains(list, value) , slapyvardį _.include(list, value) , kurios abu naudoja indexOf, jei jos perduodamos „JavaScript“ masyvui.

Kai kurios kitos struktūros siūlo panašius metodus:

Atkreipkite dėmesį, kad kai kurios struktūros tai įgyvendina kaip funkciją, o kitos prideda funkciją prie prototipo masyvo.

3855
24 сент. Atsakymą pateikia kodas 24 2009-09-24 22:35 '09, 10:35 AM 2009-09-24 22:35

Atnaujinti. Kaip komentuoja @orip, susijęs etalonas buvo įvykdytas 2008 m., Todėl rezultatai gali būti nesusiję su šiuolaikinėmis naršyklėmis. Vis dėlto tikriausiai jums tai reikės, kad palaikytumėme naujausias naršykles, ir jie tikriausiai nebuvo atnaujinti. Visada patikrinkite save.

Kaip sakė kiti, iteracija per masyvą tikriausiai yra geriausias būdas, tačiau buvo įrodyta, kad mažėjant, while kilpos yra greičiausias būdas kartoti per „JavaScript“. Todėl kodą galite perrašyti taip:

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

Žinoma, galite išplėsti „Array“ prototipą:

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

Ir dabar galite tiesiog naudoti:

 alert([1, 2, 3].contains(2)); // => true alert([1, 2, 3].contains('2')); // => false 
373
26 окт. atsakymas, kurį pateikė Damir Zekić 26 spalis 2008-10-26 02:10 '08 at 2:10 2008-10-26 02:10

indexOf , bet tai yra „ECMA-262 standarto„ JavaScript “plėtinys, todėl jis gali būti nepasiekiamas kitose standarto indexOf .“

Pavyzdys:

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

„AFAICS“ „ Microsoft“ nesiūlo jokių alternatyvų , tačiau, jei norite, galite pridėti panašias funkcijas „Internet Explorer“ (ir kitose naršyklėse, kurios nepalaiko indexOf ), kaip greita „Google“ paieška (pvz., Šis) .

169
26 окт. atsakymas pateikiamas cic 26 oct. 2008-10-26 01:49 '08, 1:49 am 2008-10-26 01:49

ECMAScript 7 pristato „ Array.prototype.includes .

Jis gali būti naudojamas taip:

 [1, 2, 3].includes(3, 3); // false [1, 2, 3].includes(3, -1); // true 

Skirtingai nuo indexOf , kuris naudoja griežtą lygybės palyginimą , includes lyginamas su SameValueZero naudojimu . Tai reiškia, kad galite nustatyti, ar masyvas turi NaN :

 new Array(5).includes(undefined); // true 

Šiuo metu jis vis dar yra projektas, bet gali būti užpildytas taip, kad jis veiktų visose naršyklėse.

139
01 янв. atsakymą pateikė Oriol Jan 01 2015-01-01 04:40 '15 at 4:40 2015-01-01 04:40

b yra reikšmė ir a yra masyvas. Jis grąžina true arba false :

 function(a, b) { return a.indexOf(b) != -1 } 
100
24 марта '12 в 7:59 2012-03-24 07:59 atsakymą pateikė William malo kovo 24 d. 12 val. 07:59 2012-03-24 07:59

Štai „ JavaScript 1.6“ suderinamasArray.indexOf įgyvendinimas:

 if (!Array.indexOf) { Array.indexOf = [].indexOf ? function(arr, obj, from) { return arr.indexOf(obj, from); } : function(arr, obj, from) { // (for IE6) var l = arr.length, i = from ? parseInt((1 * from) + (from < 0 ? l : 0), 10) : 0; i = i < 0 ? 0 : i; for (; i < l; i++) { if (i in arr  arr[i] === obj) { return i; } } return -1; }; } 
71
27 окт. atsakymą, kurį pateikė Már Örlygsson, spalio 27 d 2008-10-27 03:38 '08 at 3:38 2008-10-27 03:38

Viršutiniuose atsakymuose priskiriami primityvūs tipai, bet jei norite sužinoti, ar masyvas turi objektą su tam tikra funkcija, Array.prototype.some () yra labai elegantiškas sprendimas:

 const items = [ {a: '1'}, {a: '2'}, {a: '3'} ] items.some(item => item.a === '3') // returns true items.some(item => item.a === '4') // returns false 

Labiausiai malonus dalykas yra tai, kad iteracija nutraukiama po to, kai elementas aptinkamas, todėl išsaugomi nereikalingi iteracijos ciklai.

Be to, jis puikiai dera į if jei jis grąžina loginę vertę:

 if (items.some(item => item.a === '3')) { // do something } 

* Kaip pažymėjo pastabose dėl komentarų, šiandien, rugsėjo 2018 m., „ Array.prototype.some() visiškai palaikomas: caniuse.com palaikymo lentelė

61
18 июля '14 в 17:36 2014-07-18 17:36 Atsakymą davė Michaelas liepos 18 d. 14 d. 17:36 2014-07-18 17:36

Naudoti:

 function isInArray(array, search) { return array.indexOf(search) >= 0; } // Usage if(isInArray(my_array, "my_value")) { //... } 
50
13 сент. Matías Cánepa atsakymas rugsėjo 13 d 2013-09-13 20:32 '13, 8:32 pm 2013-09-13 20:32

„JavaScript Array išplėtimas yra tikrai bloga idėja, nes įvedate naujas savybes (savo metodus) į „ for-in kilpas, kurios gali sulaužyti esamus scenarijus. Prieš keletą metų Prototipų bibliotekos autoriai turėjo atkurti savo bibliotekos įgyvendinimą, kad pašalintų tik tokius dalykus.

Jei jums nereikia nerimauti dėl suderinamumo su kitomis jūsų svetainėje veikiančiomis „JavaScript“ programomis, eikite į jį, priešingu atveju norėčiau rekomenduoti nepatogesnį, bet saugesnį sprendimą savarankiškam darbui.

42
27 авг. atsakymą pateikė Mason Houtz 27 rug . 2009-08-27 19:45 '09 19:45 2009-08-27 19:45

Mąstydamas apie >asociatyviąją masyvą, kuris atliks paiešką naudojant maišos funkciją.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

27
23 дек. Atsakymą pateikė MattMcKnight 23 d. 2009-12-23 18:59 '09 18:59 2009-12-23 18:59

Vienos linijos:

 function contains(arr, x) { return arr.filter(function(elem) { return elem == x }).length > 0; } 
24
07 янв. Atsakyti AlonL Jan 7 2015-01-07 15:49 '15, 15:49, 2015-01-07 15:49

Naudoju:

 Array.prototype.contains = function (v) { return this.indexOf(v) > -1; } var a = [ 'foo', 'bar' ]; a.contains('foo'); // true a.contains('fox'); // false 
22
15 июня '14 в 4:15 2014-06-15 04:15 atsakymą pateikė Eduardo Cuomo birželio 14 d. 14 d. 4:15 2014-06-15 04:15
 function contains(a, obj) { return a.some(function(element){return element == obj;}) } 

Penktasis leidimas buvo pridėtas prie „ECMA-262“ standarto „ Array.prototype.some“ ()

19
12 сент. Atsakymas yra dansalmo 12 sep . 2014-09-12 19:55 '14, 19:55, 2014-09-12 19:55

Tikimės, kad greitesnis dviejų krypčių indexOf / lastIndexOf pakaitinis

2015 m

Nors naujasis įtraukimo metodas yra labai geras, parama šiuo metu yra lygi nuliui.

Aš galvoju apie tai, kaip pakeisti lėtas funkcijas „IndexOf / lastIndexOf“.

Atliktas kelias jau buvo rastas, žiūrint į viršutinius atsakymus. Iš jų aš pasirinkau „Damir Zekic“ paskelbtą funkciją, kuri turėtų būti greičiausia. Tačiau joje taip pat teigiama, kad nuo 2008 m. Taikomi kriterijai jau yra pasenę.

Aš taip pat pageidaujamą while , bet tam tikros konkrečios priežasties atveju baigiau rašyti funkciją su „for loop“. Tai galima padaryti ir while -- .

Buvau įdomu, jei iteracija buvo daug lėtesnė, jei aš tuo pačiu patikrinčiau abi masyvo puses. Akivaizdu, kad ne, ir todėl ši funkcija yra maždaug dvigubai greitesnė už geriausius rinkėjus. Akivaizdu, kad jis taip pat yra greitesnis nei gimtoji. Tai yra realioje aplinkoje, kur niekada nežinote, ar vertybė, kurią ieškote, yra masyvo pradžioje ar pabaigoje.

Kai žinote, kad ką tik spustelėjote masyvą, kurio vertė, naudodami „LastIndexOf“, tikriausiai yra geriausias sprendimas, tačiau, jei jums reikia keliauti didelėmis matricomis ir rezultatas gali būti visur, jis gali būti patvarus sprendimas pagreitinti darbą.

Dvikryptis indeksasOf / lastIndexOf

 function bidirectionalIndexOf(a, b, c, d, e){ for(c=a.length,d=c*1; c--; ){ if(a[c]==b) return c; //or this[c]===b if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b } return -1 } //Usage bidirectionalIndexOf(array,'value'); 

Veikimo bandymas

http://jsperf.com/bidirectionalindexof

Kaip testą sukūriau 100 tūkst. Įrašų.

Trys užklausos: masyvo pradžioje, viduryje ir pabaigoje.

Tikiuosi, kad taip pat rasite įdomų ir patirties.

Pastaba Kaip matote, aš šiek tiek modifikavau turinio funkciją, kad atspindėtų indexOf ir lastIndexOf produkciją (todėl dažniausiai tai true index ir false su -1 ). Jis neturėtų jam pakenkti.

Parinktys prototipui

 Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){ for(c=this.length,d=c*1; c--; ){ if(this[c]==b) return c; //or this[c]===b if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b } return -1 },writable:false, enumerable:false}); // Usage array.bidirectionalIndexOf('value'); 

Funkcija taip pat gali būti lengvai modifikuojama, kad sugrįžtumėte į tikrąjį ar netikrą, ar net objektą, eilutę ar kažką kitą.

Ir čia yra galimybė pasirinkti:

 function bidirectionalIndexOf(a, b, c, d){ c=a.length; d=c-1; while(c--){ if(b===a[c]) return c; if(b===a[dc]) return dc; } return c } // Usage bidirectionalIndexOf(array,'value'); 

Kaip tai įmanoma?

Manau, kad paprastas skaičiavimas, leidžiantis atspindėti indeksą masyve, yra toks paprastas, kad jis yra dvigubai greitesnis nei dabartinė kilpos iteracija.

Čia yra sudėtingas pavyzdys, kuris atlieka tris patikrinimus per iteraciją, tačiau tai įmanoma tik su ilgesniu skaičiavimu, dėl kurio kodas sulėtėja.

http://jsperf.com/bidirectionalindexof/2

14
19 мая '15 в 23:23 2015-05-19 23:23 atsakymą pateikė Cocco 19 d., 15 val. 23:23 2015-05-19 23:23

Mes naudojame šį fragmentą (veikia su objektais, masyvais, stygomis):

  Object.defineProperty(Object.prototype, 'inArray',{ value: function(needle, searchInKey){ var object = this; if( Object.prototype.toString.call(needle) === '[object Object]' || Object.prototype.toString.call(needle) === '[object Array]'){ needle = JSON.stringify(needle); } return Object.keys(object).some(function(key){ var value = object[key]; if( Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === '[object Array]'){ value = JSON.stringify(value); } if(searchInKey){ if(value === needle || key === needle){ return true; } }else{ if(value === needle){ return true; } } }); }, writable: true, configurable: true, enumerable: false }); 

Taikymas:

 var a = {one: "first", two: "second", foo: {three: "third"}}; a.inArray("first"); //true a.inArray("foo"); //false a.inArray("foo", true); //true - search by keys a.inArray({three: "third"}); //true var b = ["one", "two", "three", "four", {foo: 'val'}]; b.inArray("one"); //true b.inArray('foo'); //false b.inArray({foo: 'val'}) //true b.inArray("{foo: 'val'}") //false var c = "String"; c.inArray("S"); //true c.inArray("s"); //false c.inArray("2", true); //true c.inArray("20", true); //false 
12
10 сент. Atsakymą pateikė dr.dimitru 10 Sep. 2014-09-10 15:12 '14, 15:12 2014-09-10 15:12
 function inArray(elem,array) { var len = array.length; for(var i = 0 ; i < len;i++) { if(array[i] == elem){return i;} } return -1; } 

Grąžina masyvo indeksą, jei jis yra, arba -1, jei nerastas

12
27 июня '12 в 15:32 2012-06-27 15:32 atsakymą pateikė „ LmC “ birželio 27 d. 12 val. 15:32 2012-06-27 15:32

Jei pakartotinai patikrinate objekto buvimą masyve, galite peržiūrėti

  • Išsaugoti masyvą, suskirstytą į visą laiką, įterpiant įterpimą į masyvą (mes įdėjome naujus objektus į tinkamą vietą)
  • Padaryti objekto atnaujinimus kaip ištrinimo operaciją + rūšiavimo įterpimą ir
  • Naudokite dvejetainę paiešką jūsų contains(a, obj) .
12
05 февр. atsakymas pateikiamas Ztyx 05 feb . 2011-02-05 21:02 '11 at 21:02 2011-02-05 21:02

Jei naudojate „JavaScript“ 1.6 ar naujesnę versiją („Firefox 1.5“ ar naujesnė versija), galite naudoti „ Array.indexOf“ . Priešingu atveju manau, kad baigsite kažką panašaus į šaltinio kodą.

10
26 окт. Atsakymą Andru Luvisi pateikė spalio 26 d. 2008-10-26 01:44 '08 ne 1:44 2008-10-26 01:44

Naudokite kai kuriuos .

Tai glausta, tiksli ir patogi tarpplatforminė sąsaja.

Priimtas atsakymas net neatitinka reikalavimų.

Reikalavimai: rekomenduojame glaustiausią ir efektyviausią būdą sužinoti, ar masyvas turi „JavaScript“ objektą.

Priimtas atsakymas:

 $.inArray({'b': 2}, [{'a': 1}, {'b': 2}]) > -1 

Mano rekomendacija:

 _.some([{'a': 1}, {'b': 2}], {'b': 2}) > true 

Pastabos:

$. „InArray“ yra puikus, norint nustatyti, ar skalarų reikšmė yra skalarų masyve ...

 $.inArray(2, [1,2]) > 1 

... tačiau klausimas aiškiai reikalauja veiksmingo būdo nustatyti, ar objektas yra masyve.

Jei norite apdoroti skalarus ir objektus, galite tai padaryti:

 (_.isObject(item)) ? _.some(ary, item) : (_.indexOf(ary, item) > -1) 
9
21 окт. atsakymas pateikiamas l3x 21 spalis. 2015-10-21 13:57 '15, 13:57 2015-10-21 13:57

Sprendimas, kuris veikia visose šiuolaikinėse naršyklėse:

 function contains(arr, obj) { const stringifiedObj = JSON.stringify(obj); // Cache our object to not call 'JSON.stringify' on every iteration return arr.some(item => JSON.stringify(item) === stringifiedObj); } 

Naudoti:

 contains([{a: 1}, {a: 2}], {a: 1}); // true 

IE6 + sprendimas:

 function contains(arr, obj) { var stringifiedObj = JSON.stringify(obj) return arr.some(function (item) { return JSON.stringify(item) === stringifiedObj; }); } // .some polyfill, not needed for IE9+ if (!('some' in Array.prototype)) { Array.prototype.some = function (tester, that ) { for (var i = 0, n = this.length; i < n; i++) { if (i in this  tester.call(that, this[i], i, this)) return true; } return false; }; } 

Naudoti:

 contains([{a: 1}, {a: 2}], {a: 1}); // true 

Kodėl naudoti JSON.stringify ?

Array.indexOf ir „ Array.includes (taip pat dauguma čia pateiktų atsakymų) lyginami tik pagal nuorodą, o ne pagal vertę.

 [{a: 1}, {a: 2}].includes({a: 1}); // false, because {a: 1} is a new object 

premija

Neoptimali ES6 linija:

 [{a: 1}, {a: 2}].some(item => JSON.stringify(item) === JSON.stringify({a: 1)); // true 

Pastaba Objektų palyginimas pagal vertę veiks geriau, jei raktai yra išdėstyti ta pačia tvarka, todėl saugumui pirmiausia galite rūšiuoti raktus naudodami paketą, tokį kaip: https://www.npmjs.com/package/sort-keys.


Atnaujinta contains funkcija su perforacijos optimizavimu. Dėkojame, kad nurodėte tai.

9
25 янв. Igor Barbashin atsakymas, sausio 25 d 2017-01-25 03:22 '17 at 3:22 2017-01-25 03:22

Nors array.indexOf(x)!=-1 yra trumpiausias būdas tai padaryti (ir naršyklės ne interneto naršyklės palaikė daugiau nei dešimtmetį ...), tai nėra O (1), o O (N), kuris yra baisus. Jei jūsų masyvas nepasikeičia, galite konvertuoti masyvą į maišos lentelę, tada vykdyti table[x]!==undefined arba ===undefined :

 Array.prototype.toTable = function() { var t = {}; this.forEach(function(x){t[x]=true}); return t; } 

Demo:

 var toRemove = [2,4].toTable(); [1,2,3,4,5].filter(function(x){return toRemove[x]===undefined}) 

(Deja, nors galite sukurti „Array.prototype.contains“, kad įšaldytumėte masyvą ir išsaugotumėte „hash“ lentelę šioje eilutėje. kablys, kad galėtumėte išsaugoti šią būseną, kitaip nei Python.)

8
22 апр. atsakymas pateikiamas ninjagecko balandžio 22 d 2012-04-22 08:17 '12 at 8:17 am 2012-04-22 08:17

ECMAScript 6 turi elegantišką paieškos pasiūlymą.

Paieškos metodas atlieka atgalinio ryšio funkciją vieną kartą kiekvienam elementui, esančiam masyve, kol jis suranda tokį, kuriame atgalinis grįžimas grąžina tikrąją vertės vertę. Jei randamas toks elementas, nedelsiant suraskite šio elemento vertę. Priešingu atveju suraskite grąžą neapibrėžtą. atšaukimas vadinamas tik masyvo rodikliais, kurių vertės yra priskirtos; Jis nėra vadinamas rodyklėmis, kurios buvo ištrintos arba kurios niekada nebuvo priskirtos vertėms.

Toliau pateikiami MDN dokumentai .

Paieškos funkcija veikia taip.

 function isPrime(element, index, array) { var start = 2; while (start <= Math.sqrt(element)) { if (element % start++ < 1) return false; } return (element > 1); } console.log( [4, 6, 8, 12].find(isPrime) ); // Undefined, not found console.log( [4, 5, 8, 12].find(isPrime) ); // 5 

Tai galite naudoti ECMAScript 5 ir žemiau apibrėžimo funkcijos .

 if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { enumerable: false, configurable: true, writable: true, value: function(predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { if (i in list) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } } return undefined; } }); } 
7
29 мая '14 в 19:55 2014-05-29 19:55 atsakymą pristatoPradeep Mahdevu “ gegužės 29 d. 14:55 2014-05-29 19:55

Naudoti:

 var myArray = ['yellow', 'orange', 'red'] ; alert(!!~myArray.indexOf('red')); //true 

Demo

Norint tiksliai žinoti, ką „ tilde “ šiuo metu daro, kreipkitės į šį klausimą. .

6
06 окт. atsakymas, kurį pateikė Mina Gabriel 06 spalis 2013-10-06 15:25 '13, 15:25, 2013-10-06 15:25

Čia prototipas tai daro :

  function indexOf(item, i) { i || (i = 0); var length = this.length; if (i < 0) i = length + i; for (; i < length; i++) if (this[i] === item) return i; return -1; } 

Taip pat žiūrėkite čia, kad juos sujungtumėte.

4
27 авг. atsakymas pateikiamas Ken 27 rug. 2009-08-27 20:10 '09 ne 20:10 2009-08-27 20:10

Galite naudoti „ Set“ , kuris turi „turi ()“ metodą:

 function contains(arr, obj) { var proxy = new Set(arr); if (proxy.has(obj)) return true; else return false; } var arr = ['Happy', 'New', 'Year']; console.log(contains(arr, 'Happy')); 
3
16 нояб. atsakymas pateikiamas r.b. 2015-11-16 15:26 '15 15:26 2015-11-16 15:26

Gerai, galite tiesiog optimizuoti savo kodą, kad gautumėte rezultatą!

Tai yra daugybė būdų, kurie bus švaresni ir geresni, bet aš tik norėjau gauti jūsų šabloną ir kreiptis į jį naudodamas JSON.stringify

 function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (JSON.stringify(a[i]) === JSON.stringify(obj)) { return true; } } return false; } 
3
02 июля '17 в 14:31 2017-07-02 14:31 Atsakymą pateikė Alireza liepos 2 d. 17 d. 14:31 2017-07-02 14:31

Naudoti:

 Array.prototype.contains = function(x){ var retVal = -1; // x is a primitive type if(["string","number"].indexOf(typeof x)>=0 ){ retVal = this.indexOf(x);} // x is a function else if(typeof x =="function") for(var ix in this){ if((this[ix]+"")==(x+"")) retVal = ix; } //x is an object... else { var sx=JSON.stringify(x); for(var ix in this){ if(typeof this[ix] =="object"  JSON.stringify(this[ix])==sx) retVal = ix; } } //Return False if -1 else number if numeric otherwise string return (retVal === -1)?false : ( isNaN(+retVal) ? retVal : +retVal); } 

Žinau, kad tai nėra geriausias būdas eiti, bet kadangi nėra natūralaus būdo bendrauti tarp objektų, manau, kad taip arti, kad galite palyginti du masyvo objektus. Be to, „Array“ objekto išplėtimas gali būti neprotingas, tačiau kartais tai yra normalu (jei žinote apie tai ir kompromisą).

3
06 янв. Atsakymą pateikė Carlos A sausio 06 d 2012-01-06 16:43 '12 at 16:43 2012-01-06 16:43

Taip pat galite naudoti šį triuką:

 var arrayContains = function(object) { return (serverList.filter(function(currentObject) { if (currentObject === object) { return currentObject } else { return false; } }).length > 0) ? true : false } 
3
10 янв. vartotojo2724028 atsakymas 2016-01-10 13:06 '16 at 13:06 pm 2016-01-10 13:06

Kaip jau minėta, galite naudoti „ Array.indexOf , tačiau ji nėra prieinama visose naršyklėse. Čia kodas yra https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf , kad jis veiktų senesnėse naršyklėse.

indexOf yra naujausias standarto ECMA-262 priedas; kaip tokia, ji gali būti ne visose naršyklėse. Tai galite dirbti, įvesdami šį kodą savo scenarijų pradžioje, kad galėtumėte naudoti indexOf įgyvendinime, kuri nepalaiko jo. Šis algoritmas yra tiksliai toks, kaip nurodyta ECMA-262, 5-ajame leidime, darant prielaidą, kad Objektas, Tipas, Skaičius, Matematika.

 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement  ) { "use strict"; if (this == null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (len === 0) { return -1; } var n = 0; if (arguments.length > 1) { n = Number(arguments[1]); if (n != n) { // shortcut for verifying if it NaN n = 0; } else if (n != 0  n != Infinity  n != -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } if (n >= len) { return -1; } var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t  t[k] === searchElement) { return k; } } return -1; } } 
2
12 марта '13 в 8:44 2013-03-12 08:44 atsakymas pateikiamas Simon_Weaver, kovo 12 d., 13 val
  • Arba naudokite „Array.indexOf“ (objektas).
  • Naudojant ECMA 7, galite naudoti „Array.includes“ (objekto) masyvą.
  • Naudodamiesi ECMA 6, galite naudoti „Array.find“ („FunctionName“), kur „FunctionName“ yra vartotojo apibrėžta funkcija, skirta ieškoti objekto masyvo.

    Tikiuosi, kad tai padės!

2
18 авг. atsakymas duotas kg11 18 rug . 2017-08-18 07:20 '17 ne 7:20 2017-08-18 07:20
  • 1
  • 2