Js数组对象去重的几种方法

arr: [
        { id: 1, name: 'a' },
        { id: 1, name: 'f' },
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
        { id: 3, name: 'g' },
        { id: 4, name: 'd' },
        { id: 5, name: 'e' },
      ],

方法一:双重for循环

deweight() {
        for (let i = 0; i < this.arr.length - 1; i++) {
          for (let j = i + 1; j < this.arr.length; j++) {
            if (this.arr[i].id == this.arr[j].id) {
              this.arr.splice(j, 1)
              //注意这里要j--,splice删除了一个元素,下标要减一,否则循环会漏掉一个元素
              j--
            }
          }
        }
        console.log(this.arr)
      },

//方法二:reduce()

deweight() {
        var obj = {}
        this.arr = this.arr.reduce(function (data, item) {
          console.log(obj[item.id])
          obj[item.id] ? '' : obj[item.id] = true && data.push(item)
          return data;
        }, [])
        console.log(this.arr)
      },

方法三:Map()
has方法可以判断Map对象中是否存在指定元素,有则返回true,否则返回false
set方法可以向Map对象添加新元素 map.set(key, value)
values方法可以返回Map对象值的遍历器对象

deweight() {
        let map = new Map()
        for (let i of this.arr) {
          if (!map.has(i.id)) {
            map.set(i.id, i)
          }
        }
        this.arr = [...map.values()]
        console.log(this.arr)
      },

方法四 for 循环
类似方法二,obj中没有则添加 this.arr[i].id 这个key,并把值设为true,后续相同则不添加

deweight() {
        let newArr = [];
        let obj = {};
        for (var i = 0; i < this.arr.length; i++) {
          if (!obj[this.arr[i].id]) {
            newArr.push(this.arr[i]);
            obj[this.arr[i].id] = true;
          }
        }
        console.log(newArr);
      },

方法5:every()
every() 方法用于检测数组所有元素是否都符合指定条件
所有元素都满足条件,则返回 true,有一个元素不满足,则返回 false ,且剩余的元素不会再进行检测

deweight() {
        let newArr=[]
        this.arr.forEach(function(a){
          let istrue=newArr.every(function(b){
            return a.id != b.id
          })
          istrue ? newArr.push(a) : ''
        })
        console.log(newArr)
      }

这几种方法都是用 对象的某个key做为唯一标识,相同则删除

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值