js 处理数组对象,根据指定属性去重

582 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

js中想实现找到数组对象中相同的属性拿出来组成一个数组非常简单,只需要用filter即可实现;有一个数组对象List,按需要根据某个字段去重,这种情况实现起来需要一些思路

常规思路:for嵌套循环

function unique(arr,u_key){
  let result = []
  result[0] = arr[0]
  arr.forEach((meta_item,i)=>{
    //声明计数变量,如果源数组中的一个对象和result结果数组中的所有对象不同,就push
    let num = 0
    result.forEach((r_item,j)=>{
      if (meta_item[u_key]!==r_item[u_key]) {
        num++
      }
      if (num === result.length) {
        result.push(meta_item)
      }
    })
  })
  return result
}

es6使用map思路
Map类型是键值对的有序列表,Map字典是以[键,值]的形式存储,而键和值都可以是任意类型.

set设置键名key对应的键值为value,然后返回整个 Map 结构,如果key已经有值,则键值会被更新,否则就新生成该键同时返回的是当前Map对象,可采用链式写法。

get方法读取key对应的键值,如果找不到key,返回undefined。

has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

delete方法删除某个键,返回true。如果删除失败,返回false

clear方法清除所有成员,没有返回值

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回所有成员的遍历器
  • forEach():遍历 Map 的所有成员

所以我们可以通过map.has的方法确定是否有此属性与map.set设置数据的方法,结合filter去重

/**
 *    arr:要去重的数组
 *    attr: 去重根据的属性
 */
function unique(arr, attr) {
   const res = new Map();
   return arr.filter((item) => {
 
       var attrItem = item[attr]
       return !res.has(attrItem) && res.set(attrItem, 1)
 
   })
 }
 
console.log(unique(array2, "id")) // 去重后数组

使用lodash的uniqBy

let unarrlist = this.$lodash.uniqBy(Arrlist,'insurerCode');
console.log(unarrlist)

let unArr = this.$lodash.uniqBy(arrayList,'id');
console.log(unArr)