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']
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;
}