Patikrinkite, ar objektas yra masyvas?

Bandau parašyti funkciją, kuri priima styginių sąrašą arba vieną eilutę. Jei tai yra eilutė, tada noriu ją konvertuoti į masyvą, turintį tik vieną elementą. Tada aš galiu pasilikti ant jo be baimės klaidų.

Taigi, kaip galiu patikrinti, ar kintamasis yra masyvas?


Peržiūrėjau įvairius toliau pateiktus sprendimus ir sukūriau „jsperf“ testą .

2336
23 янв. nustatė mpen sausio 23 d 2011-01-23 21:53 '11 prie 21:53 2011-01-23 21:53
@ 43 atsakymai
  • 1
  • 2

Šiuolaikinėse naršyklėse galite padaryti

 Array.isArray(obj) 

(„Chrome“ 5, „Firefox 4.0“, „IE 9“, „Opera 10.5“ ir „Safari 5“ yra palaikomi )

Jei norite atgalinio suderinamumo, galite pridėti šiuos veiksmus

 # only implement if no native implementation is available if (typeof Array.isArray === 'undefined') { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } }; 

Jei naudojate jQuery, galite naudoti jQuery.isArray(obj) arba $.isArray(obj) . Jei naudojate pabraukimą, galite naudoti _.isArray(obj)

Jei jums nereikia aptikti įvairių rėmelių sukurtų matricų, galite naudoti tik instanceof

 obj instanceof Array 
534
06 янв. atsakymą pateikė Fela Winkelmolen 06 sausis 2014-01-06 21:11 '14, 21:11 2014-01-06 21:11

ECMAScript standarte nustatytas metodas, skirtas ieškoti Objektų klasei, yra toString metodas iš Object.prototype .

 if( Object.prototype.toString.call( someVar ) === '[object Array]' ) { alert( 'Array!' ); } 

Arba galite naudoti typeof kad patikrintumėte, ar tai yra eilutė:

 if( typeof someVar === 'string' ) { someVar = [ someVar ]; } 

Arba, jei nesate suinteresuotas našumu, galite tiesiog užpildyti naują tuščią masyvą.

 someVar = [].concat( someVar ); 

Taip pat yra konstruktorius, kurį galite tiesiogiai paprašyti:

 if (somevar.constructor.name == "Array") { // do something } 

Perskaitykite išsamesnį @TJ Crowder dienoraščio, paskelbto jo pastabose, aprašymą .

Peržiūrėkite šį etaloną ir gaukite, kuris metodas geriausiai veikia: http://jsben.ch/#/QgYAV

@Bharath konvertuokite eilutę į masyvą, naudodami Es6 tam tikram klausimui:

 const convertStringToArray = (object) => { return (typeof object === 'string') ? Array(object) : object } 

manau

 let m = 'bla' let n = ['bla','Meow'] let y = convertStringToArray(m) let z = convertStringToArray(n) console.log('check y: '+JSON.stringify(y)) . // check y: ['bla'] console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow'] 
1890 m
23 янв. atsakymą pateikė user113716 23 jan. 2011-01-23 21:54 '11, 21:54, 2011-01-23 21:54

Pirmiausia norėčiau patikrinti, ar jūsų diegimo isArray :

 if (Array.isArray) return Array.isArray(v); 

Taip pat galite pabandyti naudoti operatoriaus instanceof

 v instanceof Array 
1237
23 янв. atsakymą pateikė ChaosPandion, sausio 23 d 2011-01-23 21:55 '11 prie 21:55 2011-01-23 21:55

jQuery taip pat siūlo $.isArray() metodą:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
287
02 апр. atsakymas duotas janr 02 Bal 2012-04-02 15:15 '12, 15:15, 2012-04-02 15:15

Tai greičiausias tarp visų metodų (visos naršyklės yra palaikomos):

 function isArray(obj){ return !!obj  obj.constructor === Array; } 
91
06 дек. atsakymas duotas shinobi 06 dec. 2015-12-06 13:12 '15, 12:12 pm 2015-12-06 13:12

Įsivaizduokite, kad turite šią masyvą žemiau:

 var arr = [1,2,3,4,5]; 

„Javascript“ (naujos ir senos naršyklės):

 function isArray(arr) { return arr.constructor.toString().indexOf("Array") > -1; } 

arba

 function isArray(arr) { return arr instanceof Array; } 

arba

 function isArray(arr) { return Object.prototype.toString.call(arr) === '[object Array]'; } 

tada pavadinkite jį taip:

 isArray(arr); 

„Javascript“ (IE9 +, Ch5 +, FF4 +, „Saf5 +“, „Opera10. 5+“)

 Array.isArray(arr); 

„Jquery“:

 $.isArray(arr); 

Kampas:

 angular.isArray(arr); 

Pabraukimas ir Lodashas:

 _.isArray(arr); 
35
27 дек. Atsakyti Alireza gruodžio 27 d. 2016-12-27 16:17 '17, 16:17 pm 2016-12-27 16:17

„Array.isArray“ yra greitas, bet ne visoms naršyklės versijoms. Taigi, galite padaryti išimtį kitiems ir naudoti universalų metodą:

  Utils = {}; Utils.isArray = ('isArray' in Array) ? Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; } 
31
10 дек. Atsakymą pateikė „ CruorVult“ gruodžio 10 d. 2012-12-10 20:01 '12 8:01 pm 2012-12-10 20:01

Paprasta funkcija patikrinti:

 function isArray(object) { if (object.constructor === Array) return true; else return false; } 
21
04 сент. atsakymas pateikiamas MidnightTortoise 04 sep. 2012-09-04 20:56 '12, 08:56 pm 2012-09-04 20:56

Galite išbandyti šį metodą: http://web.archive.org/web/20100424091244/http://www.ajaxdr.com/code/javascript-version-of-phps-is_array-function/

EDIT : taip pat, jei jau naudojate jQuery savo projekte, galite naudoti savo $ funkciją . yraArray () .

16
23 янв. Šį atsakymą André Paramés pateikia sausio 23 d. 2011-01-23 21:56 '11, 21:56, 2011-01-23 21:56

Tik vienas linijinis šio klausimo sprendimas.

 x instanceof Array 

kur x yra kintamasis, jis grąžinamas tiesa, jei x yra masyvas, ir klaidingas, jei ne.

13
08 июня '17 в 15:48 2017-06-08 15:48 atsakymą pateikė Vikash Kumar birželio 18 d. 15:48 2017-06-08 15:48

Kaip čia sako MDN:

naudokite „ Array.isArray“ arba „ Object.prototype.toString.call“, kad išskirtumėte įprastus objektus nuo masyvų

Čia jis yra:

  • Object.prototype.toString.call(arr) === '[object Array]' , arba

  • Array.isArray(arr)

13
15 сент. atsakymas pateikiamas ajax333221 15 sep . 2012-09-15 00:02 '12 0:02 2012-09-15 00:02

Norėčiau atlikti funkciją, kad patikrintumėte objekto tipą, su kuriuo susiduriate ...

12
08 авг. atsakymą pateikė Billy Moon 08 rug. 2012-08-08 16:34 '12 at 4:34 pm 2012-08-08 16:34

Galite patikrinti kintamojo tipą, ar tai yra masyvas:

 var myArray=[]; if(myArray instanceof Array) { .... } 
12
15 янв. Ahmet DAL atsakymas sausio 15 d 2013-01-15 11:58 '13, 11:58, 2013-01-15 11:58

Aš tai labai paprasta. Jis veikia man. Bet kokie trūkumai?

 Array.prototype.isArray = true; a=[]; b={}; a.isArray // true b.isArray // (undefined -> false) 
10
04 апр. atsakymas pateikiamas rsbkk 04 balandžio. 2015-04-04 09:58 '15 at 9:58 2015-04-04 09:58

Tai yra bandymas pagerinti šį atsakymą su komentarais:

 var isArray = myArray  myArray.constructor === Array; 

Ji atsikratoma, jei / kitaip, ir atsižvelgia į galimybę, kad masyvas yra nulinis arba neapibrėžtas.

10
01 апр. atsakymą pateikė George Jempty 01 balandis. 2015-04-01 23:35 '15, 23:35, 2015-04-01 23:35

Atnaujinau jsperf scenarijų naudodamas du alternatyvius metodus, taip pat klaidų tikrinimą.

Pasirodo, kad metodas, nustatantis pastovią vertę „Objektas“ ir „Array“, yra greitesnis nei bet kuris kitas metodas. Tai šiek tiek stebina rezultatas.

9
01 авг. atsakymas pateikiamas le_top 01 rug . 2015-08-01 14:10 '15 ne 14:10 2015-08-01 14:10

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray

 Array.isArray = Array.isArray || function (vArg) { return Object.prototype.toString.call(vArg) === "[object Array]"; }; 
9
05 марта '13 в 11:26 2013-03-05 11:26 atsakymas duotas Safareli 05 kovo 13 d. 11:26 2013-03-05 11:26

Žinau, kad žmonės ieško tam tikrų originalių „JavaScript“ metodų. Bet jei norite mažiau galvoti, žiūrėkite čia: http://underscorejs.org/#isArray

 _.isArray(object) 

Grąžinamas tiesa, jei objektas yra masyvas.

 (function(){ return _.isArray(arguments); })(); => false _.isArray([1,2,3]); => true 
8
04 апр. atsakymą pateikė Eugene 04 balandžio. 2012-04-04 03:46 '12 at 3:46 2012-04-04 03:46

Galite naudoti „isArray“ metodą, bet norėčiau patikrinti

Object.getPrototypeOf(yourvariable) === Array.prototype

5
28 февр. Atsakymas pateikiamas STEEL vasario 28 d. 2018-02-28 20:21 '18, 8:21 pm 2018-02-28 20:21

Čia yra mano tingus požiūris:

 if (Array.prototype.array_ === undefined) { Array.prototype.array_ = true; } // ... var test = [], wat = {}; console.log(test.array_ === true); // true console.log(wat.array_ === true); // false 

Žinau, kad tai yra piktžodžiavimas „protestuodamas“ su prototipu, bet jis atrodo daug geriau nei rekomenduojamas metodas .

Pastaba Šio požiūrio spąstai yra tai, kad jis neveikia per iframe ribas , tačiau tai nėra mano problema.

5
11 янв. Atsakymas suteiktas namuol 11 jan. 2013-01-11 11:56 '13, 11:56, 2013-01-11 11:56

„Stoyan Stefanov“ knygoje yra geras „ JavaScript“ modelių pavyzdys , apimantis visas galimas problemas, taip pat naudojamas „ECMAScript 5“ Array.isArray () metodas.

Taigi, čia yra:

 if (typeof Array.isArray === "undefined") { Array.isArray = function (arg) { return Object.prototype.toString.call(arg) === "[object Array]"; }; } 

Beje, jei naudojate jQuery, galite naudoti savo $ .isArray () metodą

5
15 дек. atsakymą pateikė Salvador Dali 15 d. 2013-12-15 10:11 '13, 10:11 2013-12-15 10:11

Geriausias sprendimas, kurį mačiau, yra kryžminio naršyklės keitimas. Čia rasite „ Angus Croll“ sprendimą.

TL versija; DR yra žemiau, tačiau straipsnis yra puiki diskusija apie problemą, todėl turėtumėte jį perskaityti, jei turite laiko.

 Object.toType = function(obj) { return ({}).toString.call(obj).match(/\s([az|AZ]+)/)[1].toLowerCase(); } // ... and usage: Object.toType([1,2,3]); //"array" (all browsers) // or to test... var shouldBeAnArray = [1,2,3]; if(Object.toType(shouldBeAnArray) === 'array'){}; 
5
23 марта '12 в 20:07 2012-03-23 20:07 Atsakymą pateikė Johnas Wundesas kovo 12 d. 12 d. 20:07 2012-03-23 ​​20:07

Paprasčiausias ir greičiausias būdas patikrinti, ar objektas yra masyvas, ar ne.

  var arr = []; arr.constructor.name ==='Array' //return true; 

arba

 arr.constructor ===Array //return true; 

Arba galite atlikti paslaugos funkciją:

 function isArray(obj){ return obj  obj.constructor ===Array} 

naudoti:

 isArray(arr); //return true 
4
01 марта '17 в 12:25 2017-03-01 12:25 atsakymas duotas garbei nuo kovo 1 d. 17 d. 12:25 2017-03-01 12:25
 function isArray(value) { if (value) { if (typeof value === 'object') { return (Object.prototype.toString.call(value) == '[object Array]') } } return false; } var ar = ["ff","tt"] alert(isArray(ar)) 
4
30 окт. Atsakymas pateikiamas RoboTamer 30 sp . 2013-10-30 00:26 '13 - 0:26 2013-10-30 00:26

Galite žinoti, kad jūsų objektas neturi concat metodo.

4
24 авг. atsakymas pateikiamas taip, 24 d. 2016-08-24 11:02 '16 at 11:02 am 2016-08-24 11:02

Paprasta funkcija patikrinti, ar įvesties vertė yra masyvas taip:

 function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]'; } 

Tai veikia kaip tarpinė naršyklė ir senos naršyklės. Tai išgaunama iš „TJ The Brownian Blog Post“

4
02 февр. Atsakymas duotas Brado parke 02 vasario 2 d. 2014-02-02 03:29 '14 at 3:29 2014-02-02 03:29

Jei vienintelės dviejų tipų reikšmės, kurias galima perduoti šiai funkcijai, yra eilutės arba eilutės, išsaugokite jį paprasčiausiai ir naudokite patikrinimo typeof kad įjungtumėte eilutę:

 function someFunc(arg) { var arr = (typeof arg == "string") ? [arg] : arg; } 
4
23 янв. Tim Down atsakymas Jan 23 2011-01-23 22:51 '11, 10:51 val. 2011-01-23 22:51

Ši funkcija beveik viską pavers į masyvą:

 function arr(x) { if(x === null || x === undefined) { return []; } if(Array.isArray(x)) { return x; } if(isString(x) || isNumber(x)) { return [x]; } if(x[Symbol.iterator] !== undefined || x.length !== undefined) { return Array.from(x); } return [x]; } function isString(x) { return Object.prototype.toString.call(x) === "[object String]" } function isNumber(x) { return Object.prototype.toString.call(x) === "[object Number]" } 

Jis naudoja keletą naujų naršyklės funkcijų, todėl galbūt norėsite, kad maksimali parama gautų polifilą.

Pavyzdžiai:

 > arr(null); [] > arr(undefined) [] > arr(3.14) [ 3.14 ] > arr(1/0) [ Infinity ] > gen = function*() { yield 1; yield 2; yield 3; } [Function: gen] > arr(gen()) [ 1, 2, 3 ] > arr([4,5,6]) [ 4, 5, 6 ] > arr("foo") [ 'foo' ] 

NB eilutės bus konvertuojamos į masyvą su vienu elementu, o ne simbolių masyvu. Pašalinkite „ isString patikrinimą, jei norite priešingą.

Aš naudoju „ Array.isArray nes tai yra patikimiausias ir paprasčiausias.

4
24 окт. atsakymas pateikiamas 24 val. 2016-10-24 18:48 '16 at 18:48 PM 2016-10-24 18:48

Laimei, ECMA 5 2009 m. Gruodžio mėn. Pristatė „ Array.isArray() . Jei dėl kokių nors priežasčių naudojate javascript senesnę nei ECMA 5 versiją, atnaujinkite ją.

Tačiau, jei to reikalaujate, matricos turi tam tikras savybes, kurios jas skiria nuo bet kokio kito tipo. Ypatybės, kurių nematau kitų atsakymų. Pereikime prie javascript politikos.

Masyvas yra objektas (tipas typeof [] === "object" ), tačiau skirtingai nuo tradicinių objektų, jie turi ilgio nuosavybę ( typeof ( {}).length === "undefined" ). null pat yra objektas (tipo typeof null === "object" ), bet negalite pasiekti null savybės, nes null nėra objektas. Tai yra specifikacijos klaida, kuri visiškai grįžta į pačią „JavaScript“ pradžią, kai objektams yra 0 tipo žyma, o null - kaip pažodinis nulinis žymeklis 0x00 , todėl vertėjas supainiojo jį su objektais.

Deja, tai neatsižvelgia į [] vs {length:0} . Todėl turime eiti į prototipų grandinę.

( []).__proto__ === Array.prototype ( []).__proto__ !== Object.prototype .

Taigi, be „ Array.isArray() , tai yra maždaug artimiausia, kurią galime gauti:

 function is_array(array){ return array !== null  typeof array === "object"  array.__proto__ === Array.prototype; } [ [], [1,2,3], {length: 0}, {}, 1, 0, Infinity, NaN, "1", "[1,2,3]", null, undefined, [null], [undefined], {a:[]}, [{}], [{length: 0}], [Infinity], [NaN], {__proto__: Array.prototype} ].filter(is_array) // Expected: [ [], [1,2,3], [null], [undefined], [{}], [{length: 0}], [Infinity], [NaN] ] // Actual: [ [], [1,2,3], [null], [undefined], [{}], [{length: 0}], [Infinity], [NaN], {__proto__: Array.prototype} ] 

Objektas, kenkėjiškai suprojektuotas taip, kad atrodytų kaip masyvas, iš tikrųjų praeina perjungimo testą. Tačiau prototipo grandinės keitimas Array prototipo grandine yra pakankamas, kad jis veiktų kaip masyvas, efektyviai sukuriant masyvą. Array.isArray() yra vienintelis dalykas pasaulyje, kuris Array.isArray() toks objektas tikrai nėra masyvas. Tačiau tuo tikslu, kurį paprastai patikrinate, norėdami pamatyti, ar objektas yra masyvas, šis objektas turi būti gerai suderintas su jūsų kodu. Net elgesys, kai dirbtinai keičiate masyvo ilgį, yra tas pats: jei ilgis yra didesnis nei masyvo elementų skaičius, turėsite „specialių netiesioginio“ tipo „tuščias laiko tarpsnius“, kuris kažkaip skiriasi nuo neapibrėžtos, ir === undefined ; tas pats tipas, todėl mes naudojame typeof obj !== "undefined" tipą, kad išvengtume ReferenceError metaduomenų, nes obj === undefined tiesiog nepateikia klaidos, jei obj aiškiai apibrėžtas kaip undefined .

 a = {__proto__: Array.prototype}; // Array {} a.push(5) a // [5] a.length = 5 a // [5, empty x 4] b = a.map(n => n*n) // [25, empty x 4] b.push(undefined) b.push(undefined) b // [25, empty x 4, undefined, undefined] b[1] // undefined b[1] === b[5] // true Array.isArray(a) // false Array.isArray(b) // true 

Tačiau nenaudokite is_array() . Vienas dalykas yra išrasti mokymosi ratą. Tai dar vienas dalykas, kurį reikia padaryti gamybos kode. Net nenaudokite jo kaip polipolio. Parama senesnėms JS versijoms reiškia paramą senesnėms naršyklėms, o tai reiškia, kad reikia skatinti naudoti nesaugią programinę įrangą, kuri kelia pavojų kenkėjiškai programinei įrangai.

3
19 июля '18 в 22:12 2018-07-19 22:12 atsakymas suteiktas Bradenui Best 19 liepa, 18 val. 10:12 pm 2018-07-19 22:12
 A = [1,2,3] console.log(A.map==[].map) 

Ieškote trumpiausios versijos, ką aš iki šiol turėjau.

Atkreipkite dėmesį, kad nėra tobulos funkcijos, kuri visada aptiktų visus galimus derinius. Geriau žinoti visas jūsų įrankių galimybes ir apribojimus, nei tikėtis stebuklingo įrankio.

3
12 марта '13 в 5:57 2013-03-12 05:57 atsakymas pateikiamas egz. knygoje „ Kovo 12, 13“, 5:57 2013-03-12 05:57
  • 1
  • 2

Kiti klausimai dėl žymių arba Užduoti klausimą