Nustatykite, ar masyvas turi vertę

Turiu nustatyti, ar masyve yra reikšmė.

Naudoju šią funkciją:

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

Pirmiau nurodyta funkcija visada grąžina klaidingą.

Masyvo vertės ir funkcijų skambučiai yra tokie:

 arrValues = ["Sam","Great", "Sample", "High"] alert(arrValues.contains("Sam")); 
1167
25 июля '09 в 11:18 2009-07-25 11:18 Prasadas yra nustatytas liepos 25 d., 09:18, 2009-07-25 11:18
@ 19 atsakymų
 var contains = function(needle) { // Per spec, the way to identify NaN is that it is not equal to itself var findNaN = needle !== needle; var indexOf; if(!findNaN  typeof Array.prototype.indexOf === 'function') { indexOf = Array.prototype.indexOf; } else { indexOf = function(needle) { var i = -1, index = -1; for(i = 0; i < this.length; i++) { var item = this[i]; if((findNaN  item !== item) || item === needle) { index = i; break; } } return index; }; } return indexOf.call(this, needle) > -1; }; 

Ją galite naudoti taip:

 var myArray = [0,1,2], needle = 1, index = contains.call(myArray, needle); // true 

Patikrinkite / naudokite „CodePen“

956
25 июля '09 в 11:22 2009-07-25 11:22 atsakymas pateikiamas akių vokiškumu liepos 25 d. , 09:22 2009-07-25 11:22

jQuery turi naudingumo funkciją:

 $.inArray(value, array) 
border=0

Grąžina array value indeksą. Grąžina -1 jei array neturi value .

Taip pat žr. Kaip patikrinti, ar masyvas apima „JavaScript“ objektą?

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

Paprastai tai yra indekso () metodas. Jūs sakytumėte:

 return arrValues.indexOf('Sam') > -1 
764
25 июля '09 в 11:25 2009-07-25 11:25 atsakymą pateikė Gabriel Hurley, liepos 25 d., 09:25, 2009-07-25 11:25

Array.prototype.includes ()

ES2016 yra Array.prototype.includes() .

includes() metodas nustato, ar masyvas turi elementą, jei reikia, grąžina true ar false .

Pavyzdys

kangax ir MDN palaikomos šios platformos: 

  • „Chrome“ 47
  • Edge 14
  • „Firefox“ 43
  • Opera 34
  • „Safari 9“
  • 6 mazgas

Parama gali būti pratęsta Babeliu (naudojant babel-polyfill ) arba core-js . MDN taip pat suteikia polifilis :

 if (![].includes) { Array.prototype.includes = function(searchElement  ) { 'use strict'; var O = Object(this); var len = parseInt(O.length) || 0; if (len === 0) { return false; } var n = parseInt(arguments[1]) || 0; var k; if (n >= 0) { k = n; } else { k = len + n; if (k < 0) {k = 0;} } var currentElement; while (k < len) { currentElement = O[k]; if (searchElement === currentElement || (searchElement !== searchElement  currentElement !== currentElement)) { return true; } k++; } return false; }; } 
261
09 июня '15 в 9:45 2015-06-09 09:45 Atsakymas duotas Dale birželio 09, 15, 9:45 2015-06-09 09:45

Beveik visada saugiau naudotis biblioteka, pvz., „ Lodash“, tiesiog dėl visų kryžminės naršyklės suderinamumo ir našumo problemų.

Efektyvumas, nes galite būti tikri, kad bet kuriuo metu labai populiarioji biblioteka, pavyzdžiui, pabraukimas, turės efektyviausią būdą atlikti tokią naudingumo funkciją.

 _.includes([1, 2, 3], 3); // returns true 

Jei nerimaujate, kad jūsų programoje pridedamas kiekis, įskaitant visą biblioteką, atkreipkite dėmesį, kad galite įtraukti šią funkciją atskirai:

 var includes = require('lodash/collections/includes'); 

PASTABA. Senesnėse „lodash“ versijose tai yra _.contains() ir ne _.includes() .

116
25 янв. atsakymas pateikiamas ncabral 25 jan. 2014-01-25 06:00 '14, 6:00, 2014-01-25 06:00

tl; dr

 function includes(k) { for(var i=0; i < this.length; i++){ if( this[i] === k || ( this[i] !== this[i]  k !== k ) ){ return true; } } return false; } 

Pavyzdys

 #out{ font-family:monospace; } 
čia . 

Jei norite išplėsti įterptą „ Array objektą naudodami būdą, galbūt geriausias ir atsakingiausias būdas tai padaryti būtų naudoti šį polifilą iš MDN . (Taip pat žr. Šį MDN straipsnio dėl prototipo paveldėjimo skyrių, kuriame paaiškinama, kad „vienintelė gera priežastis išplėsti integruotą prototipą yra atvirkštinis naujų„ JavaScript “variklių, pvz.,„ Array.forEach “, funkcijų perdavimas“)

 if (!Array.prototype.includes) { Array.prototype.includes = function(searchElement  ) { 'use strict'; var O = Object(this); var len = parseInt(O.length) || 0; if (len === 0) { return false; } var n = parseInt(arguments[1]) || 0; var k; if (n >= 0) { k = n; } else { k = len + n; if (k < 0) {k = 0;} } var currentElement; while (k < len) { currentElement = O[k]; if (searchElement === currentElement || (searchElement !== searchElement  currentElement !== currentElement)) { return true; } k++; } return false; }; } 

Nenorite griežtos lygybės ar norite pasirinkti?

 function includes(k, strict) { strict = strict !== false; // default is true // strict = !!strict; // default is false for(var i=0; i < this.length; i++){ if( (this[i] === k  strict) || (this[i] == k  !strict) || (this[i] !== this[i]  k !== k) ) { return true; } } return false; } 
46
15 сент. atsakymą pateikė Trevor rugsėjo 15 d 2011-09-15 23:03 '11, 23:03, 2011-09-15 23:03

Su ECMAScript6 galite naudoti Set :

33
07 янв. Atsakyti Nicolas 07 Jan 2016-01-07 16:05 '16, 16:05 pm 2016-01-07 16:05

Mano nedidelis indėlis:

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

Atsižvelgiant į tai, kad yra įgyvendintas indeksas „IEO“ (kaip aprašyta be žinių):

 Array.prototype.contains = function(obj) { return this.indexOf(obj) > -1; }; 
17
25 июля '09 в 12:12 2009-07-25 12:12 atsakymą pateikė rlovtang liepos 25 d. , 09:12, 2009-07-25 12:12

Jei turite prieigą prie ECMA 5, galite naudoti tam tikrą metodą.

MDN Kai kuri metodo nuoroda

 arrValues = ["Sam","Great", "Sample", "High"]; function namePresent(name){ return name === this.toString(); } // Note: // namePresent requires .toString() method to coerce primitive value // ie String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"} // into // "Sam" arrValues.some(namePresent, 'Sam'); => true; 

Jei turite prieigą prie ECMA 6, galite naudoti įtraukimo metodą.

MDN apima metodo nuorodą

 arrValues = ["Sam","Great", "Sample", "High"]; arrValues.includes('Sam'); => true; 
15
31 июля '15 в 18:46 2015-07-31 18:46 atsakymą pateikė „ SoEzPz“ liepos 31 d. 15 val. 18:46 2015-07-31 18:46

Galite naudoti _. „IndexOf“ metodas arba, jei nenorite įtraukti visos „Underscore.js“ bibliotekos į savo programą, galite pamatyti, kaip jie tai padarė, ir ištraukite reikiamą kodą.

  _.indexOf = function(array, item, isSorted) { if (array == null) return -1; var i = 0, l = array.length; if (isSorted) { if (typeof isSorted == 'number') { i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); } else { i = _.sortedIndex(array, item); return array[i] === item ? i : -1; } } if (nativeIndexOf  array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); for (; i < l; i++) if (array[i] === item) return i; return -1; }; 
11
11 янв. Atsakymą pateikė Wojciech Bednarski sausio 11 d 2013-01-11 19:54 '13, 19:54, 2013-01-11 19:54

Kita galimybė yra naudoti „ Array.some ( jei yra ) taip:

 Array.prototype.contains = function(obj) { return this.some( function(e){ return e === obj } ); } 

Anoniminė funkcija, perduota „ Array.some true jei ir tik tuo atveju, jei masyvo elementas yra identiškas obj . Tokio elemento nebuvimas, funkcija nebebus true nė vienam iš masyvo elementų, todėl „ Array.some taip pat grąžina false .

9
08 февр. Atsakymą pateikė Hunan Rostomyan 08 Feb. 2015-02-08 03:37 '15 at 3:37 2015-02-08 03:37

Oho, yra daug puikių atsakymų į šį klausimą.

Nematau, kad būtų laikomasi reduce požiūrio, todėl pridėsiu prie:

 var searchForValue = 'pig'; var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){ return previous || searchForValue === current ? true : false; }, false); console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray); 

Čia yra veikiantis smuikas .

6
07 марта '16 в 18:51 2016-03-07 18:51 Atsakymą pateikė Chris Schmitz , kovo 7 d. 16 d. 18:51 2016-03-07 18:51

Atsakymas man nepateikiamas, bet jis man davė idėją:

 Array.prototype.contains = function(obj) { return (this.join(',')).indexOf(obj) > -1; } 

Tai nėra ideali, nes elementai, kurie yra vienodi už grupių ribų, gali sukelti rungtynes. Pavyzdžiui, mano pavyzdys

 var c=[]; var d=[]; function a() { var e = '1'; var f = '2'; c[0] = ['1','1']; c[1] = ['2','2']; c[2] = ['3','3']; d[0] = [document.getElementById('g').value,document.getElementById('h').value]; document.getElementById('i').value = c.join(','); document.getElementById('j').value = d.join(','); document.getElementById('b').value = c.contains(d); } 

Kai aš vadinu šią funkciją su laukais „g“ ir „h“, kuriuose yra atitinkamai 1 ir 2, jis vis dar jį suranda, nes gauta seka iš sąjungos: 1,1,2,2,3,3

Kadangi mano situacijoje kyla abejonių, ar aš susidursiu su tokia situacija, naudoju. Maniau, kad norėčiau pasidalinti tuo, kad kažkas negalėjo gauti pasirinkto atsakymo į darbą.

4
24 мая '11 в 21:09 2011-05-24 21:09 atsakymą įteikė Kakoroat , gegužės 24 d. 11 d. 21:09 2011-05-24 21:09

Naudojant masyvo funkciją .map, kuris atlieka funkciją kiekvienai matricos reikšmei, man atrodo švariausias.

Nuoroda: Array.prototype.map ()

Šis metodas gali būti naudingas ir paprastoms matricoms, ir objektų masyvams, kur reikia pamatyti, ar raktų / reikšmių yra objektų grupėje.

 function inArray(myArray,myValue){ var inArray = false; myArray.map(function(key){ if (key === myValue){ inArray=true; } }); return inArray; }; var anArray = [2,4,6,8] console.log(inArray(anArray, 8)); // returns true console.log(inArray(anArray, 1)); // returns false function inArrayOfObjects(myArray,myValue,objElement){ var inArray = false; myArray.map(function(arrayObj){ if (arrayObj[objElement] === myValue) { inArray=true; } }); return inArray; }; var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}] console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false 
4
16 июня '15 в 20:06 2015-06-16 20:06 Atsakymą pateikė Ian Vasquez birželio 15 d. 15 val. 20:06 2015-06-16 20:06
 function setFound(){ var l = arr.length, textBox1 = document.getElementById("text1"); for(var i=0; i<l;i++) { if(arr[i]==searchele){ textBox1 .value = "Found"; return; } } textBox1 .value = "Not Found"; return; } 

Ši programa tikrina, ar elementas randamas, ar ne. Norėčiau text1 būti teksto lauko identifikatorius, o paieškos užklausa - tai elementas, kuris turėtų būti ieškomas (gautas vartotojui); jei reikia indekso, naudokite vertę i

2
24 июля '14 в 11:40 2014-07-24 11:40 atsakymas duotas deeban liepos 24 d., 14 val

Paprasčiausias išrinkimo funkcijos sprendimas yra tokia funkcija:

 var contains = function (haystack, needle) { return !!~haystack.indexOf(needle); } 

Idealiu atveju nepadarytumėte jos savarankiškos funkcijos, bet pagalbinės bibliotekos dalis:

 var helper = {}; helper.array = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... }; 

Dabar, jei esate vienas iš tų nelaimingų žmonių, kuriems vis dar reikia paramos „IE <9“ ir todėl negalite pasikliauti „ indexOf , galite naudoti šią „ polyfill“, kurią gavau iš MDN :

 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return -1; } var n = +fromIndex || 0; if (Math.abs(n) === Infinity) { n = 0; } if (n >= len) { return -1; } k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in o  o[k] === searchElement) { return k; } k++; } return -1; }; } 
1
26 февр. John Slegers atsakymas 26 vasaris 2016-02-26 03:10 '16 at 3:10 2016-02-26 03:10

Labai rekomenduoju tai

 if(/Element/g.test(Array)){---} 
-2
04 дек. Animesh Kumar atsakymas 04 d. 2017-12-04 23:59 '17, 23:59 pm 2017-12-04 23:59

Norėčiau paprastumo:

 var days = [1, 2, 3, 4, 5]; if ( 2 in days ) {console.log('weekday');} 
-4
06 мая '14 в 10:02 2014-05-06 10:02 atsakymą pateikė valeri 06 gegužės 14 d. 10:02 2014-05-06 10:02

Kiti klausimai apie „ arba Užduoti klausimą