Jeg forsøger at skrive en funktion, der enten accepterer en liste af strenge eller en enkelt streng. Hvis det er en streng, så vil jeg konvertere den til et array med kun det ene element. Så kan jeg loope over det uden at være bange for en fejl.
Så hvordan tjekker jeg, om variablen er et array?
Jeg har samlet de forskellige løsninger nedenfor og oprettet en jsperf test.
Den metode, der er angivet i ECMAScript-standarden til at finde klassen for Object, er at bruge metoden toString
fra Object.prototype
.
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
alert( 'Array!' );
}
Eller du kan bruge typeof
til at teste, om det er en String:
if( typeof someVar === 'string' ) {
someVar = [ someVar ];
}
Eller hvis du ikke er bekymret for ydeevnen, kan du bare lave en concat
til et nyt tomt Array.
someVar = [].concat( someVar );
Der er også konstruktøren, som du kan forespørge direkte:
if (somevar.constructor.name == "Array") {
// do something
}
Se en grundig behandling fra @T.J. Crowder's blog, som skrevet i hans kommentar nedenfor.
Tjek denne benchmark for at få en idé om, hvilken metode der klarer sig bedst: http://jsben.ch/#/QgYAV
Fra @Bharath konvertere streng til array ved hjælp af Es6 til det stillede spørgsmål:
const convertStringToArray = (object) => {
return (typeof object === 'string') ? Array(object) : object
}
formoder:
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']
Hvis de eneste to slags værdier, der kan overføres til denne funktion, er en streng eller et array af strenge, skal du gøre det enkelt og bruge en typeof
-kontrol for muligheden for streng:
function someFunc(arg) {
var arr = (typeof arg == "string") ? [arg] : arg;
}