程序实现要求为:写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
实现思路为,传入的所有数组组合为一个数组,然后去重即可;
我的代码如下:
function unite(arr1, arr2, arr3) {
var bigarr=[];
//因为不确定拼接数组的个数,即不确定参数个数,所以用arguments来进行参数的遍历,把所有的数组组合为一个数组,
for(var j=0,len=arguments.length;j<len;j++){
bigarr = bigarr.concat(arguments[j]);
}
//数组去重的函数,新建一个数组,把原数组的元素一个一个放进去,若改元素已存在则不再放进去
function unique(arr){
var newArr = [];
for(var i=0,len1=arr.length;i<len1;i++){
if(newArr.indexOf(arr[i])==-1){
newArr.push(arr[i]);
}
}
return newArr;
}
return unique(bigarr);
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
这样写呢,思路是对的,但是过程略微复杂了点,在js中有更精简的方法实现,即利用 Arguments object 和 Array.reduce(),
arguments
是一个类似数组的对象, 对应于传递给函数的参数。
- arguments对象不是一个
Array
。它类似于数组,但除了 长度之外没有任何数组属性。可以使用Array.from()
方法或 spread 运算符将 arguments 转换为真正的数组:
- 而数组中的reduce方法则可以进行数组拼接,然后用filter()方法进行数组去重即可;
function unite(arr1, arr2, arr3) { var args = Array.from(arguments); var arr = args.reduce(function(prev,cur){ return prev.concat(cur); }); return arr.filter(function(item,index,arr){ return arr.indexOf(item) === index; }); } unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);