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

How do i concat arrays with unknown amount of arguments

本文关键字:数数 未知 数组 参数 何连接 连接      更新时间:2023-09-26

我有了函数uniteUnique。它应该获得参数并将它们连接到单个数组。如果有特定数量的参数,例如3,我会像下面的函数

那样实现它。
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]

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

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

arguments对象并不是真正的Array实例,也没有任何Array方法。因此,arguments.slice(…)将不起作用,因为arguments对象没有slice方法。

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

要了解更全面的解释,请参阅这个SO答案…

(回答OP评论):

如果你需要深度合并,你可以这样做:

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

甚至:

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

这应该工作,因为Symbol.isConcatSpreadable的默认值是false,所以concat()作用深度

根据您的示例,您想要扁平化参数数组。在ES6中,你可以使用Rest参数来获取参数数组和Spread语法来平面化它:

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

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

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

能像那样解决这个问题,

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