Próbuję napisać funkcję, która albo akceptuje listę łańcuchów, albo pojedynczy łańcuch. Jeśli jest to ciąg znaków, to chcę go przekonwertować na tablicę z tylko jednym elementem. Wtedy będę mógł zapętlać się nad nim bez obawy o błąd.
Jak więc sprawdzić, czy zmienna jest tablicą?
I've rounded up różnych rozwiązań poniżej i stworzył jsperf test.
Metodą podaną w standardzie ECMAScript do znalezienia klasy obiektu jest użycie metody toString
z Object.prototype
.
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
alert( 'Array!' );
}
Można też użyć typeof
, aby sprawdzić, czy jest to String:
if( typeof someVar === 'string' ) {
someVar = [ someVar ];
}
Lub jeśli'nie martwisz się o wydajność, możesz po prostu zrobić concat
do nowej pustej tablicy.
someVar = [].concat( someVar );
Istnieje również konstruktor, do którego można się bezpośrednio odwoływać:
if (somevar.constructor.name == "Array") {
// do something
}
Sprawdź dokładne leczenie z @T.J. Crowder's blog, jak zamieszczono w jego komentarzu poniżej.
Sprawdź ten benchmark, aby zorientować się, która metoda działa lepiej: http://jsben.ch/#/QgYAV
Od @Bharath przekonwertuj ciąg znaków na tablicę za pomocą Es6 dla zadanego pytania:
const convertStringToArray = (object) => {
return (typeof object === 'string') ? Array(object) : object
}
przypuśćmy:
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']
Jeśli jedyne dwa rodzaje wartości, które mogą być przekazane do tej funkcji to łańcuch lub tablica łańcuchów, zachowaj prostotę i użyj typeof
dla możliwości łańcucha:
function someFunc(arg) {
var arr = (typeof arg == "string") ? [arg] : arg;
}