Javascript: спрятать строку прямо к переменным
Я хотел бы знать, поддерживает ли стандартный JS способ разделения строки прямо на набор переменных во время их первоначального объявления. Например, в perl я бы использовал:
my ($a, $b, $c) = split '-', $str;
В Firefox я могу написать
var [a, b, c] = str.split('-');
Но этот синтаксис не является частью стандарта ECMA и как таковой разрыв во всех других браузерах. То, что я пытаюсь сделать, - это не писать:
var array = str.split('-');
var a = array[0];
var b = array[1];
var c = array[2];
Потому что для кода, который я пишу в данный момент, такой метод будет настоящей болью, я создаю 20 переменных из 7 разных разделов и не хочу использовать такой подробный метод.
Кто-нибудь знает об элегантном способе сделать это?
Ответы
Ответ 1
Вы можете сделать это немного более элегантно, опуская ключевое слово var для каждой переменной и разделяя выражения запятыми:
var array = str.split('-'),
a = array[0], b = array[1], c = array[2];
ES6 стандартизирует назначение деструктуризации, что позволяет вам делать то, что Firefox уже давно поддерживает:
var [a, b, c] = str.split('-');
Вы можете проверить поддержку браузера, используя таблицу совместимости Kangax .
Ответ 2
var str = '123',
array = str.split('');
(function(a, b, c) {
a; // 1
b; // 2
c; // 3
}).apply(null, array)
Ответ 3
Вы можете создать функцию, которая будет проходить через массив, созданный методом str.split, и автоматически генерировать переменные следующим образом:
function autoGenerateVarFromArray(srcArray, varNamePrefix)
{
var i = 0
while(i < srcArray.length)
{
this[varNamePrefix +'_' + i] = srcArray[i];
i++;
}
}
Вот пример того, как это использовать:
var someString = "Mary had a little Lamb";
autoGenerateVarFromArray(someString.split(' '), 'temp');
alert(this.temp_3); // little
Ответ 4
Разбейте строку на две переменные части для предложения из 3 или более слов.
> var [firstName, lastName] = 'Ravindra Kumar Padhi'.split(/(\w+)$/)
> console.log({firstName: firstName.trim(), lastName: lastName.trim()})
{ firstName: 'Ravindra Kumar', lastName: 'Padhi' }