Ako skontrolovať, či je objekt poľom?

Snažím sa napísať funkciu, ktorá prijíma buď zoznam reťazcov, alebo jeden reťazec. Ak je to reťazec, potom ho chcem previesť na pole s jedinou položkou. Potom nad ním môžem prechádzať v cykle bez obáv z chyby.

Ako teda skontrolujem, či je premenná pole?


Nižšie som zhrnula rôzne riešenia a vytvorila jsperf test.

Metóda uvedená v štandarde ECMAScript na zistenie triedy Object je použitie metódy toString z Object.prototype.

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

Alebo môžete použiť typeof na testovanie, či ide o String:

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

Alebo, ak vám nezáleží na výkone, môžete jednoducho vykonať concat na nové prázdne pole.

someVar = [].concat( someVar );

Existuje'aj konštruktor, ktorého sa môžete opýtať priamo:

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

Pozrite si dôkladné spracovanie z blogu @T.J. Crowder's, ako je uvedené v jeho komentári nižšie.

Pozrite si tento benchmark, aby ste získali predstavu, ktorá metóda je výkonnejšia: http://jsben.ch/#/QgYAV

Od @Bharath previesť reťazec na pole pomocou Es6 pre položenú otázku:

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

predpokladám:

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']
Komentáre (29)

Najprv by som skontroloval, či vaša implementácia podporuje isArray:

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

Mohli by ste tiež skúsiť použiť operátor instanceof

v instanceof Array
Komentáre (11)

Ak jediné dva druhy hodnôt, ktoré môžu byť odovzdané tejto funkcii, sú reťazec alebo pole reťazcov, zachovajte jednoduchosť a použite kontrolu typeof pre možnosť reťazca:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
Komentáre (1)