所以我的功能是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]
答案 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]]) ;