Poskušam napisati funkcijo, ki sprejme seznam nizov ali en sam niz. Če je to niz, ga želim pretvoriti v polje s samo enim elementom. Potem lahko v zanki krožim nad njo brez strahu pred napako.
Kako torej preverim, ali je spremenljivka polje?
V nadaljevanju sem zbral različne rešitve in ustvaril jsperf test.
V standardu ECMAScript je za iskanje razreda objekta navedena metoda toString
iz Object.prototype
.
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
alert( 'Array!' );
}
Lahko pa uporabite tudi typeof
za preverjanje, ali je objekt String:
if( typeof someVar === 'string' ) {
someVar = [ someVar ];
}
Če pa vas ne skrbi zmogljivost, lahko preprosto izvedete concat
na novo prazno polje.
someVar = [].concat( someVar );
Na voljo je tudi konstruktor, po katerem lahko poizvedujete neposredno:
if (somevar.constructor.name == "Array") {
// do something
}
Oglejte si temeljito obravnavo z bloga @T.J. Crowder's, kot je objavljeno v njegovem komentarju spodaj.
Za lažjo predstavo o tem, katera metoda je učinkovitejša, si oglejte to primerjalno testiranje: http://jsben.ch/#/QgYAV
Od @Bharath pretvori niz v polje z uporabo Es6 za zastavljeno vprašanje:
const convertStringToArray = (object) => {
return (typeof object === 'string') ? Array(object) : object
}
domnevamo:
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']
Če sta edini vrsti vrednosti, ki ju lahko posredujemo tej funkciji, niz ali polje nizov, jo poenostavimo in uporabimo preverjanje typeof
za možnost niza:
function someFunc(arg) {
var arr = (typeof arg == "string") ? [arg] : arg;
}