js 你不知道的那些东西——JS数组去重

150 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

数组去重的方式and本质。

什么叫做数据去重

什么叫做数据去重这个问题的本质是问:什么叫做重 顾名思义,就是相同的意思,js判断相同的方式有很多种比如**==**

  console.log(null == undefined);
  // true

可以得到true,但是换一种

  console.log(null === undefined);
  // false

就会得到false,再比如:

  console.log(NaN === NaN);
  // false

也会得到false,再比如:

  console.log(Object.is(NaN, NaN));
  // true

为什么又得到true了呢?

会发现js本身判断相同的方式得到的结果还不一样,如果加上业务场景,会更复杂。比如:

    let obj1 = {
      name: 'zs',
      id: 1
    }
    let obj2 = {
      name: 'zs',
      id: 1
    }
    console.log(obj1 === obj2);
    // false

尽管两个对象长得一模一样,但是因为地址不一样,所以js会判断他们两个不相同。

但是在业务场景下,这两个id一样,那就是同一个人,所以判断两个东西是否相同,要看场景。

去重的本质

讲之前,先看一道经典面试题:

    /**
     * 数组去重
     * 原始值使用严格相等比较
     * 对象值递归比较所有属性,,属性数量和属性名称必须必须一致
     * 数组中的对象均为planin object
     * @param {Array} arr 
     * @param {Array}
     */
     
    function uniqueArray (arr) {

    }

之前的那几种方式好像都不管用,所以问哦们只能用最原始的写法。

    /**
     * 数组去重
     * 原始值使用严格相等比较
     * 数组中的对象均为planin object
     * @param {Array} arr 
     * @param {Array}
     */
 
    function uniqueArray (arr) {
      let result = []
      for (var i = 0; i < arr.length; i++) {
        var IsFind = false
        for (var j; j < result.length; j++) {
          if (IsFind[j] === arr[i]) {
            IsFind = true
            break;
          }
        }
        if (!IsFind) {
          result.push(arr[i])
        }
      }
      return result
    }
    
    let Arr1 = [1, 1, 2, 3, 3, 3, 5, 6, 6, 8]
    console.log(uniqueArray(Arr1));

image.png

总结:

不管什么方法,我们不难发现,其实原理都是差不多,都是循环加判断实现,