Sorted Union
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。
非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。
unite([1, 3, 2], [5, 2, 1, 4], [2, 1])
应该返回 [1, 3, 2, 5, 4]
。unite([1, 3, 2], [1, [5]], [2, [4]])
应该返回 [1, 3, 2, [5], [4]]
。unite([1, 2, 3], [5, 2, 1])
应该返回 [1, 2, 3, 5]
。unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])
应该返回 [1, 2, 3, 5, 4, 6, 7, 8]
。function unite() { var arr=[]; //unite中参数总数目(即数组个数) var len=arguments.length; //控制遍历哪个数组(arguments[i],i可取0~len-1) var i=0; while(i<len){ //控制遍历的数组arguments[i]中元素下标 var j=0; while(j<arguments[i].length){ //如果arr中没有索引为i的数组参数中的索引为j的元素 //将其push到arr中 if(arr.indexOf(arguments[i][j])==-1) arr.push(arguments[i][j]); j++; } i++; } return arr; } unite([1, 3, 2], [1, [5]], [2, [4]]);
···········································································································································································································
重点:由于有多个数组参数,需要用Array.prototype.concat.apply([],arugument)进行合并,用apply的原因是支持第二个参数为数组形式的
function uniteUnique(arr1, arr2, arr3) { var newArray=[]; var allArray=Array.prototype.concat.apply([], arguments) for(var i=0;i<allArray.length;i++){ if(newArray.indexOf(allArray[i])===-1){ newArray.push(allArray[i]); } } return newArray; } console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
function unite() { if(arguments.length === 1){ return arguments[0]; } var arr = [], res = []; for(var i=0,len=arguments.length;i<len;i++){ arr = arguments[i]; for(var j=0;j<arr.length;j++){ //如果结果数组中不存在该值则放入数组 if(res.indexOf(arr[j]) === -1){ res.push(arr[j]); } } } return res; } unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
思路
主干思路很清晰,先拼接数组,再去重。
先把所有参数拼接成数组,这需要用到 Array 的归并方法 reduce()
。但传进来的参数 arguments 只是类数组对象,我们首先要把它转化为真正的数组:
var args = Array.from(arguments);
然后得到一个拼接而成的大数组:
var arr = args.reduce(function(prev,cur,index,array){
return prev.concat(cur);
});
最后用`filter()`方法去重:
arr.filter(function(item,index,array){
return array.indexOf(item) === index;
});
function unite(arr1, arr2, arr3) { var args = Array.from(arguments); var arr = args.reduce(function(prev,cur,index,array){ return prev.concat(cur); }); return arr.filter(function(item,index,array){ return array.indexOf(item) === index; }); }