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;
  });
}

 

posted @ 2016-11-29 11:28  兴趣使然的椰子  阅读(758)  评论(0编辑  收藏  举报