• 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;
      });
    }
  • 相关阅读:
    mapreduce参数记录
    find命令使用中记录
    运算符的优先级(从高到低)
    常用字符与ASCII代码对照表
    mysql在liunx上使用记录
    Java 流收集器 ( Stream Collectors )
    CDH 删除Agent节点(退役节点)
    学习记录CombineFileInputFormat类
    读取HBases的数据的三种常见用法
    hash算法学习
  • 原文地址:https://www.cnblogs.com/fffangrui/p/6112851.html
Copyright © 2020-2023  润新知