Come controllare se un oggetto è un array?

Sto cercando di scrivere una funzione che accetti una lista di stringhe o una singola stringa. Se è una stringa, allora voglio convertirla in un array con un solo elemento. Poi posso fare un loop su di esso senza paura di un errore.

Quindi come faccio a controllare se la variabile è un array?


Ho arrotondato le varie soluzioni qui sotto e ho creato un jsperf test.

Il metodo dato nello standard ECMAScript per trovare la classe di Object è di usare il metodo toString da Object.prototype.

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

Oppure si può usare typeof per testare se è una stringa:

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

Oppure, se non siete preoccupati per le prestazioni, potreste semplicemente fare un concat in un nuovo Array vuoto.

someVar = [].concat( someVar );

C'è anche il costruttore che si può interrogare direttamente:

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

Date un'occhiata ad un trattamento approfondito dal blog di @T.J. Crowder's, come postato nel suo commento qui sotto.

Controlla questo benchmark per avere un'idea di quale metodo si comporta meglio: http://jsben.ch/#/QgYAV

Da @Bharath convertire la stringa in array usando Es6 per la domanda posta:

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

supporre:

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']
Commentari (29)

Per prima cosa controllerei se la tua implementazione supporta isArray:

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

Potresti anche provare a usare l'operatore instanceof.

v instanceof Array
Commentari (11)

Se gli unici due tipi di valori che potrebbero essere passati a questa funzione sono una stringa o un array di stringhe, mantenetela semplice e usate un controllo typeof per la possibilità di stringa:

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