【问题标题】:ES6: What happens if the rest parameter is an array?ES6:如果其余参数是一个数组会发生什么?
【发布时间】:2016-01-23 05:25:47
【问题描述】:

如果我有:

function foo(number, ...args) {
   //foo to add args to sum
}

我希望调用者能够像这样调用 foo:

foo(10, 1, 2, 3); // 16

或:

foo(10, [1, 2, 3]); //16

问题是如何实现这一点。 我可以这样做吗:

function foo(number, ...args) {
    let toAddArr = Array.isArray(args[0]) ? args[0] : args;
    for (let toAdd of toAddArr) {
        number = number + toAdd;
    }
    return number;
}

【问题讨论】:

  • 你总是只想添加数字吗?
  • 看起来不错。你试过了吗?
  • @webduvet 只是一个例子,我正在编写一个完全不同的函数,其中 args 可以是参数或数组
  • @RocketHazmat 还没有...

标签: javascript ecmascript-6


【解决方案1】:

你可以使用一些递归:

function foo(...args) {
    var sum = 0;
    args.forEach((arg) => {
        if (!Array.isArray(arg))
            sum += arg
        else
            sum += foo(...arg); // if it's an array, destructure
    });
    return sum;
}

使用该代码,您甚至可以根据需要在数组内部传递数组:)

编辑,使用for 循环:

function foo(...args) {
    var sum = 0;
    for (var arg of args) {
        if (!Array.isArray(arg))
            sum += arg
        else
            sum += foo(...arg); // if it's an array, destructure
    };
    return sum;
}

【讨论】:

  • 我不懂 (arg) => {} 语法,我的意思是我知道它是一个箭头函数,但我不明白你是如何使用它的。
  • 这只是ArrayforEach 函数,我更喜欢使用它而不是for 循环,但它做同样的事情。我添加了一个for 版本,所以你可以区别,不多。
【解决方案2】:

您可以将参数转换为数组并将它们连接起来。

function foo(){
   return [].concat.apply([],Array.prototype.slice.call(arguments)).reduce( function (p,c) { return p + c; }, 0);
}
var x1 = foo(10, [1,2,3]);
console.log(x1);

var x2 = foo(10,1,2,3);
console.log(x2);

【讨论】:

  • 你可以用[].slice.call(arguments)代替Array.prototype.slice.call(arguments)
  • 如果 arguments = 10, [1, 2, 3],Array.prototype.slice(arguments) 如何工作?不是调用期望参数而不是数组吗?
  • arguments 不是一个数组,所以它将它转换为一个数组,这样我就可以对它运行数组方法。 concat 行比折叠数组(如果有的话)。
【解决方案3】:

您可以将.concat.apply 一起使用,并与.reduce 相加,就像这样

function foo(...args) {
  return ([].concat.apply([], args)).reduce(function (prev, curr) {
    return prev + curr;
  }, 0);
}

Example

【讨论】:

    【解决方案4】:

    对于嵌套数组,递归可能会很好地工作。您可以只有数字或数组或嵌套数组或混合。

      function add() {
        return Array.prototype.reduce.call(arguments, function(p, c) {
          if (Array.isArray(c)) {
            return p + add.apply(null, c);
          } else {
            return p + c;
          }
        });
      }
    

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2011-01-08
      • 1970-01-01
      • 2013-10-03
      • 2010-10-18
      相关资源
      最近更新 更多