1.问题描述

写一个 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]]。

2.用到的方法

Array.prototype.reduce()

Array.prototype.filter()

Array.prototype.from()

3.代码如下

function unite(arr1, arr2, arr3){
  //使用arguments遍历所有数组,并且放入一个newArr中,这个时候newArr = [[arr1],[arr2],[arr3]]
  var newArr = Array.from(arguments);
  //使用reduce遍历新数组,根据reduce的参数,a来表示上一次调用返回的值,b来表示正在处理的元素
  //然后把b都拼接到a当中,最后返回的 arr = [arr1,arr2,arr3],合成了一个大数组,方便我们使用函数。
  var arr = newArr.reduce(function(a,b){
    return a.concat(b);
  });
  //最后使用filter遍历arr,根据filter的参数,element代表当前元素,index代表当前元素的索引。
  return arr.filter(function(element,index){
    //核心函数:filter筛选出当前函数 ==它当前的索引,比如上面第一例中,当element指向第一个2时,
    return arr.indexOf(element) == index;
  });
  /*index为2,这个indexOf的返回是正确的;
  而当element指向第二个2时,index变成了4,而arr.indexOf(element)返回的值还是2(查找到第一个2的索引并返回),
  所以这时候就把后面重复的数都筛选去掉了。
  最后一步是关键点,而且也非常的巧妙。*/
}

unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
Last modification:May 10th, 2020 at 12:38 pm
如果觉得我的文章对你有用,请随意赞赏