JavaScript中如何在未知参数数量的情况下向函数传递多个参数?
解决可变参数的数组合并去重问题
你找的方向完全没错!arguments对象就是处理这种参数数量不确定场景的绝佳方案——不管你定义函数时声明了几个形参,它都会自动收集调用时传入的所有参数。
先理解arguments的工作方式
你测试的这段代码:
function uniteUnique() { console.log(arguments) } uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])
控制台输出的{ '0': [1, 3, 2], '1': [5, 2, 1, 4], '2': [2, 1] }就是arguments的结构:它是一个类数组对象,通过索引就能访问到每个传入的数组参数。
完整实现uniteUnique函数
基于这个思路,我们可以写出满足需求的完整函数——合并所有传入的数组,同时去除重复元素:
function uniteUnique() { // 把类数组的arguments转换成真正的数组 const argsArray = Array.from(arguments); // 合并所有子数组为一个一维数组 const mergedArray = argsArray.flat(); // 利用Set的唯一性去重,再转回数组 return [...new Set(mergedArray)]; } // 测试示例 console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])); // 输出: [1, 3, 2, 5, 4]
ES6更优雅的替代方案:剩余参数
如果你用的是ES6及以上的环境,更推荐用剩余参数语法(...args),它直接把所有传入的参数收集成一个真正的数组,写法更直观,可读性更强:
function uniteUnique(...args) { const mergedArray = args.flat(); return [...new Set(mergedArray)]; }
甚至可以写成更简洁的箭头函数版本:
const uniteUnique = (...args) => [...new Set(args.flat())];
额外注意事项
arguments是类数组对象,必须先转换成真正的数组(比如用Array.from()或Array.prototype.slice.call(arguments))才能使用flat()这类数组方法。- 如果你的参数里有多层嵌套的数组,可以给
flat()传入Infinity来完全展开:argsArray.flat(Infinity)。
内容的提问来源于stack exchange,提问作者Chris H.
相关产品推荐
相关产品推荐

