简单去重比较

准备测试代码:

const arr1 = Array.from (new Array (100000), (item, index) => {
  return index;
});
const arr2 = Array.from (new Array (50000), (item, index) => {
  return index * 2;
});
console.log ('开始测试');
const start = new Date().getTime();
distinct(arr1, arr2); // 去重方法
const end = new Date ().getTime ();
console.log ('测试结束');
console.log ('测试时间' + (end - start) / 1000 + 's');

一:filter + indexOf

function distinct(arr1, arr2) {
  console.log('filter + indexOf');
  const arr = [...arr1, ...arr2];
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index;
  });
}

效果:时间11s

二:双重循环,删除(splice)重复项

function distinct(a, b) {
  console.log('双重for循环');
  const arr = a.concat(b);
  for (let i = 0, len = arr.length; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j, 1);
        // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
        len--;
        j--;
      }
    }
  }
  return arr
}

效果:22s

 三、includes + push

function distinct(arr1, arr2) {
  console.log('includes + push新数组');
  const arr = [...arr1, ...arr2];
  const result = [];
  for (item of arr) {
    !result.includes(item) && result.push(item);
  }
  return result;
}

效果:11s

 

四、先排序(sort),然后比较临近2个

function distinct(arr1, arr2) {
  console.log('先排序, 比较临近的2个 然后push');
  let arr = [...arr1, ...arr2];
  arr = arr.sort((a, b) => {return a - b});
  const result = [];
  for (let i = 0, len = arr.length; i < len; i++) {
    (arr[i] !== arr[i + 1]) && result.push(arr[i]);
  }
  return result;
}

效果:0.03s

四、使用set

function distinct(arr1, arr2) {
  console.log('使用set');
  const arr = [...arr1, ...arr2];
  return Array.from(new Set(arr));
}

效果:0.04s

五、 for循环配合对象使用,然后push

function distinct(arr1, arr2) {
  console.log('for循环配合对象使用,然后push');
  const arr = [...arr1, ...arr2];
  const len = arr.length;
  const obj = {};
  const result = [];
  for (let i = 0; i < len; i++){
    if (!obj[i]) {
      result.push(arr[i]);
      obj[i] = 1;
    }
  }
  return result;
}

效果:0.03s

六、reduce

function distinct(arr1, arr2) {
  console.log('reduce');
  const arr = [...arr1, ...arr2];
  arr.reduce((prev, cur) => {
    if (!prev.includes(cur)) {
      return [...prev, cur];
    } else {
      return prev;
    }
  }, []);
}

效果:110s

猜你喜欢

转载自www.cnblogs.com/adanxiaobo/p/11764805.html