JS数组的去重

JS数组去重解决方案:

摘自:http://www.cnblogs.com/yxqd/p/10381932.html

方案一:

/**
1、构建一个新的数组
2、遍历目标数组,依次取出每一个元素
3、将取出的元素与新数组里面的所有元素进行比较,如果没有出现,则把该元 
     素添加到新数组中;如果出现,则返回处理下一个元素
*/
function distinct(arr){
    console.time();
    var rseult = [];
    for(var i=0,len=arr.length,i<len,i++){
        for(var j=0,resLen=result.length,j<=resLen,j++){
            if(arr[i]==resule[j]){
                break;
            }
            if(j==resLen){
                result.push(arr[i]);
            }
        }   
    }
    console.timeEnd();
    return result;
}

方案优点:

  • 结果数组与目标数组的顺序保持一致
  • 思路简单,兼容性好

方案缺点:

  • 速度慢

方案二:

/**
1、将目标数组排序
2、遍历目标数组,检测目标数组的第i个元素与新数组的最后一个元素是否相同。如果不同,则将该元素添加到目标数组中。
*/
function distinct2(arr){
    console.time();
    arr = arr.sort();
    var result = [];
    for(var i=0,len =arr.length,i<len,i++){
        if(arr[i]!=result[result.length-1]){
            result.push(arr[i]);
        }
    }
    console.endTime();
    return result;
}

方案优点:

  • 因为先排序后遍历,所以较方法一速度快

方案缺点:

  • 新数组打乱了原料的顺序

Tips:数组排序

js中提供了数组排序方法sort,使用时需要注意以下几点:

  1. 调用sort方法时改变了目标数组本身,非生成新数组
  2. sort方法默认按照字符顺序进行排序,不过提供了回调方法,可以自定义排序规则

现有一数组arr:1,11,23,56,3,4,5,7,562,67

按字符排序
arr.sort() // 1, 11, 23, 3, 4, 5, 56, 562, 67, 7
按数字大小:正序
arr.sort((a,b) => a-b) // 1, 3, 4, 5, 7, 11, 23, 56, 67, 562
按数字大小:倒序
arr.sort((a,b) => b-a) // 562, 67, 56, 23, 11, 7, 5, 4, 3, 1

方案三:

/**
1、利用ES6的 数组结构set的无重复性特性
2、array.from()将类数组转换成数组
*/
function distinct3(arr){
    console.time();
    var result = Array.from(new Set(arr));
    console.endTime();
    return result;
}

方案优点:

  • 代码简洁,执行速度快

方案缺点:

  • ES6语法,使用时需要考虑兼容性问题

 

方案四:

/**
1、利用对象属性无重复的特点
2、遍历目标数组,将值设置为对象属性
   Object.keys将对象的所有属性提取成一个对象
*/
function distinct4(arr){
    console.time();
    var result = [];
    for(var i=0,len=arr.length,i<len,i++){
        result[arr[i]] = '';
    }
    result = Object.keys(result);
    consloe.endTime();
    return result;
}

方案优点:

  • 速度快

方案缺点:

  • 1与‘1’无法区分
  • 结果数组中的值全部为字符串
  • 比较耗内存,相当于用空间换时间

方案五:

/**
1、Array.filter 数组过滤函数,只保留符合条件的值
2、indexOf 查找元素第一次出现的位置,所有第一次之后查找的元素位置都不符合条件
*/
function distinct(arr) {
    console.time();
    var result = arr.filter(function (elem, index, self) {
      return self.indexOf(elem) === index;
    });
    console.timeEnd();
    return result;
  }

从执行速度来看,方法四 > 方法三 >方法二 > 方法五 >方法一
方法四最快,方法一最慢。但是五种方法各有优缺点,使用时要根据实际情况选择适合的方案。

猜你喜欢

转载自www.cnblogs.com/su-zhifei/p/10394447.html