将一个字符串拆分成变量

69

我想知道标准的JS是否提供了在变量声明时将字符串直接拆分为一组变量的方法。例如,在Perl中,我会使用:

my ($a, $b, $c) = split '-', $str;
在Firefox中,我可以编写

var [a, b, c] = str.split('-');

但是这种语法不是ECMAScript第五版的一部分,因此在所有其他浏览器中都会出现错误。我试图做的是避免编写以下内容:

var array = str.split('-');
var a = array[0];
var b = array[1];
var c = array[2];
因为对我目前正在编写的代码而言,这种方法会非常痛苦,我正在从7个不同的分割中创建20个变量,而且不想使用这种冗长的方法。 有人知道更好的解决方案吗?

2
为什么需要将它们转储到“var”对象中?这里的最终目标是什么? - hunter
这是一个网页表单的一部分,用于管理我们校园内小型活动数据库。为了向用户展示数据格式化后的外观,我们直接从表单字段(使用jquery)获取信息并生成少量HTML。为了正确格式化日期范围和其他一些信息,最好将其存储在命名变量中,而不是尝试使用类似$('input[name=start_date]').val().split(' ')的方法来提取正确的值。请参阅http://pastie.org/1102123 - nb5
可能是在JavaScript中将数组解包为单独的变量的重复问题。 - Andy E
4个回答

126

通过省略每个变量的var关键字并用逗号分隔表达式,您只能稍微更加优雅地完成它:

var array = str.split('-'),
    a = array[0], b = array[1], c = array[2];

ES6标准化了解构赋值,它允许你做Firefox已经支持了一段时间的事情:

var [a, b, c] = str.split('-');
您可以通过Kangax的兼容性表格来检查浏览器的支持情况:compatibility table

3
我早就有所怀疑。不得不如此冗长地表达真是太遗憾了。啊,好吧,谢谢你的帮助 :) - nb5
你也可以在高尔夫代码中删除“var”:[a,b,c] = str.split(' - '); - Elo
Internet Explorer 又出问题了! - Akin Williams
1
这张表格特别展示了解构赋值:https://caniuse.com/mdn-javascript_operators_destructuring 简而言之,除了 MSIE11 及更早版本不支持外,在所有地方都得到支持。 - Luc

9
var str = '123',
    array = str.split('');

(function(a, b, c) {
    a; // 1
    b; // 2
    c; // 3
}).apply(null, array)

apply是一个很酷的方法,但我想使用更少的代码而不是更多的代码 ;) - nb5
@nb5:我认为这并不比“var a = array [0],b = array [1],c = array [2]”多写多少代码。 - viam0Zah
也许在这个脚本中我会使用这个7次。 - nb5
@mplungjain:它应该可以工作。你需要处理变量以查看它们的值,例如尝试使用alert - viam0Zah
1
我给你点赞。这种方法与逗号分隔变量的解决方案之间的唯一区别在于,这些变量仅在此函数范围内可用,而不是外部范围也可用。如果此闭包包装了使用变量的整个代码,则不会有问题。 - Andy E

6
将一个三个或更多单词的句子拆分为两个部分变量。
> var [firstName, lastName] = 'Ravindra Kumar Padhi'.split(/(\w+)$/)

> console.log({firstName: firstName.trim(), lastName: lastName.trim()})
{ firstName: 'Ravindra Kumar', lastName: 'Padhi' }

0
你可以创建一个函数,通过 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

这很酷,但据我所见,使用单个名称前缀后跟数字生成的变量与直接按索引引用数组项几乎没有什么区别。 - nb5
@nb5:没错。如果你有一个巨大的数组和很多变量需要初始化,那么这个解决方案可能更具可扩展性。如果你只有一个小的数组大小,那么其他发布的解决方案也不错(例如:var apple = a[1], banana = a[2]等)。 - Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接