【问题标题】:Efficient way to have an Array from differing variable type从不同变量类型中获取数组的有效方法
【发布时间】:2018-10-04 13:08:12
【问题描述】:

这不是一个真正的问题,但我喜欢提高我的 JavaScript/ES6 技能。

我试图找到一种更有效的方法来始终拥有一个数组,无论我的传入变量只有一个值还是一个数组。

我目前正在做的是:

var inp;

// just for the showcase
if (Math.random() > 0.5) {
  inp = 'foo';
} else {
  inp = ['foo', 'bar'];
}

// this is what I want to optimize
if (Array.isArray(inp)) {
  outp = inp;
} else {
  outp = [inp];
}

console.log(outp);

不是说只是不惜一切代价缩短代码,而是效率和优雅。

【问题讨论】:

标签: javascript performance optimization ecmascript-6


【解决方案1】:

许多方法都是可能的。取决于您不希望检测到的准确度。一个简单的例子:

var outp = Array.isArray(inp) ? inp : in[];

这只不过是您的代码的简写。

你应该问问自己这是否可取。如果您的函数需要一个数组但获取一个字符串作为输入。它还应该继续吗?许多接口为此提供了不同的显式方法。例如:add(array)addOne(string)

【讨论】:

    【解决方案2】:

    您可以使用concat 跳过此isArray 检查:

    const outp = [].concat(inp);
    

    它总是会给你一个包含元素的数组(不是嵌套的):

    [].concat('foo')
    // ['foo']
    
    [].concat(['foo'])
    // ['foo']
    

    【讨论】:

    • 优雅的解决方案
    • 如果你真的非常需要删除那一行代码,我猜就是这样。就我个人而言,我认为这可能有点不直观,因为这段代码应该完成什么以及为什么它甚至在那里并不是很明显,这可能会让外部查看者(或几周后的你自己)难以理解。尽管如此,还是因为它可以工作并且可以满足 OP 的需求而受到支持 :)
    • 这似乎是less efficient,我认为是harder to read
    【解决方案3】:

    如果Math.random小于0.5,你可以concat空数组[]

    ["foo"].concat( Math.random > 0.5 ? "bar" : [] )
    

    【讨论】:

      【解决方案4】:

      测试一下怎么样?这是给你的 jsperf:https://jsperf.com/dynamic-array-creation

      instanceof 似乎是最有效的方式。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多