【问题标题】:Split a string straight into variables将字符串直接拆分为变量
【发布时间】:2011-04-01 03:31:18
【问题描述】:

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

my ($a, $b, $c) = split '-', $str;

在 Firefox 中我可以写

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

但是这种语法不是 ECMAScript 第 5 版的一部分,因此在所有其他浏览器中都会中断。我想要做的是避免写:

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

因为对于我目前正在编写的代码来说,这样的方法会很痛苦,我从 7 个不同的拆分中创建了 20 个变量,并且不想使用这种冗长的方法。

有人知道这样做的优雅方法吗?

【问题讨论】:

  • 为什么需要将这些转储到var 对象中?这里的结局是什么?
  • 它是用于管理我们校园现场活动的小型数据库的网络表单的一部分。为了向用户展示他们的数据在格式化后的外观,我们直接从表单字段中获取信息(使用 jquery)并生成少量 HTML。为了正确格式化日期范围和其他一些信息,将其存储在命名变量中比尝试使用 $('input[name=start_date]') 之类的东西来梳理出正确的值要方便得多。 val().split('')。见pastie.org/1102123

标签: javascript string destructuring


【解决方案1】:

将一个字符串分成两部分变量,用于 3 个或更多单词的句子。

> var [firstName, lastName] = 'Ravindra Kumar Padhi'.split(/(\w+)$/)

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

【讨论】:

    【解决方案2】:

    您只能通过省略每个变量的 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 检查浏览器支持。

    【讨论】:

    • 我也很怀疑。不得不如此冗长似乎是一种耻辱。嗯,谢谢你的帮助:)
    • 您也可以删除高尔夫代码的“var”:[a,b,c]=str.split('-');
    • Internet Explorer 再次来袭!
    • 此表具体显示了解构分配:caniuse.com/mdn-javascript_operators_destructuring TL;除 MSIE11 和更早版本外,所有地方都支持 DR。
    【解决方案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
    

    【讨论】:

    • 这很酷,但据我所知,使用单个名称前缀后跟数字的自动生成变量与仅通过索引直接引用数组项几乎没有什么不同。
    • @nb5:确实如此。如果您有一个庞大的数组和许多要初始化的变量,则此解决方案可能更具可扩展性。如果您只有一个小数组大小,那么发布的其他解决方案还不错(var apple = a[1]、banana = a[2] 等)
    【解决方案4】:
    var str = '123',
        array = str.split('');
    
    (function(a, b, c) {
        a; // 1
        b; // 2
        c; // 3
    }).apply(null, array)
    

    【讨论】:

    • apply 是一个很酷的方法,但我希望使用更少的代码而不是更多的代码;)
    • @nb5:我不认为它var a = array[0], b = array[1], c = array[2];更多的代码。
    • 也许可以,但在这个脚本中我会使用 7 次。
    • @mplungjain:应该可以。您必须处理变量以查看它们的值,例如尝试alert他们。
    • +1 来自我。 this 和逗号分隔的 var 解决方案之间的一个区别是,这些变量仅在此函数的范围内可用,而不是在外部范围内。如果这个闭包包裹在使用变量的整个代码中,这不是问题。
    猜你喜欢
    • 2015-11-30
    • 2017-06-28
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2015-08-17
    相关资源
    最近更新 更多