如何使用未知数量的参数连接数组

时间:2016-09-06 09:23:24

标签: javascript concat

所以我的功能是uniteUnique。它应该获取参数并将它们连接到一个数组。如果示例3中存在特定数量的参数,我将像函数bellow

那样实现它
function uniteUnique(arr) {
  var args = [];
  var newArgs;
 for (var i = 0; i < arguments.length; i++) {
    args.push(arguments[i]);
    newArgs = args[0].concat(args[1], args[2]);
  }
  return newArgs ;
}

uniteUnique([1, 3, 2], [1, [5]], [2, [4]]);

但是,如果uniteUnique函数有2个参数或任何其他数字,那该怎么办呢。

uniteUnique([1, 2, 3], [5, 2, 1])

如何让我的函数知道它应该连接多少个参数,以及如何在concat()函数中实现它?

编辑:

输出应如下所示:

uniteUnique([1, 3, 2], [1, [5]], [2, [4]])应该返回[1,3,1,1,[5],2, [4]] and uniteUnique([1, 2, 3], [5, 2, 1])应该返回[1,2,3,5,2,1]

4 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解你的问题,但是:这个简单的解决方案呢?

function uniteUnique() {
  return Array.prototype.slice.call(arguments);
}

arguments对象实际上不是Array实例,并且没有任何Array方法。因此,arguments.slice(...)将不起作用,因为arguments对象没有slice方法。

相反,Arrays确实有这种方法,并且因为arguments对象与数组非常相似(...),所以两者是兼容的。这意味着我们可以将数组方法与arguments对象一起使用。数组方法将返回数组而不是其他参数对象。

如需更详细的解释,请参阅this SO answer ...

更新(回答OP评论):

如果您需要深度合并,您可以执行以下操作:

function uniteUnique() {
  return Array.prototype.concat.apply([], arrays);
}

甚至:

function uniteUnique() {
  return [].concat.apply([], arrays);
}

这应该有效,因为Symbol.isConcatSpreadable的dafaule值为false,因此concat()行为深度 ......

答案 1 :(得分:0)

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments

您可以访问arguments变量来遍历传递给给定函数的所有参数。

答案 2 :(得分:0)

根据你的例子,你想要展平参数数组。在ES6中,您可以使用Rest parameters来获取参数数组,使用Spread syntax来展平它:

function uniteUnique(...args) {
  return [].concat(...args);
}

答案 3 :(得分:0)

能够像那样解决这个问题,

function uniteUnique(arr) {
   var myNewArray = [].concat.apply([], Array.prototype.slice.call(arguments));
  return myNewArray;
}
uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) ;