Я намагаюсь написати функцію, яка приймає або список рядків, або один рядок. Якщо це рядок, то я хочу перетворити його в масив з одним елементом. Тоді я зможу обходити його в циклі, не боячись помилки.
Як же перевірити, чи змінна є масивом?
Я зібрав різні рішення нижче і створив jsperf-тест.
Наведений у стандарті ECMAScript спосіб пошуку класу Object полягає у використанні методу toString
з Object.prototype
.
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
alert( 'Array!' );
}
Або можна використати метод typeof
для перевірки, чи є він рядком:
if( typeof someVar === 'string' ) {
someVar = [ someVar ];
}
Або, якщо вас не турбує продуктивність, ви можете просто зробити concat
до нового порожнього масиву.
someVar = [].concat( someVar );
Існує також конструктор, до якого ви можете звернутися безпосередньо:
if (somevar.constructor.name == "Array") {
// do something
}
Ознайомтеся з ретельним лікуванням з блогу @T.J. Crowder's, як зазначено в його коментарі нижче.
Перегляньте цей тест, щоб отримати уявлення про те, який метод працює краще: http://jsben.ch/#/QgYAV
Від @Bharath перетворення рядка в масив за допомогою Es6 для заданого питання:
const convertStringToArray = (object) => {
return (typeof object === 'string') ? Array(object) : object
}
припустимо:
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']
Я б спочатку перевірив, чи підтримує ваша реалізація isArray
:
if (Array.isArray)
return Array.isArray(v);
Ви також можете спробувати використати оператор instanceof
v instanceof Array
Якщо єдиними двома типами значень, які можуть бути передані в цю функцію, є рядок або масив рядків, спростіть її і використовуйте перевірку typeof
для можливості передачі рядка:
function someFunc(arg) {
var arr = (typeof arg == "string") ? [arg] : arg;
}