js 数组对象根据对象中的指定属性去重

参考链接:
(1)JS数组对象根据对象中的指定属性去重
https://901web.com/post/js-object-unique.html

有一个数组对象List,按需要根据某个字段去重。

const Arrlist = [{
        "id": 1,
        "gmtCreated": "2020-12-01 14:18:36",
        "gmtModified": "2020-12-08 16:35:04",
        "productCode": "HHM01",
        "insurerCode": "000183",
        "insurerName": "华海财险",
        "versionName": "华海投保",
        "versionCode": ""
    },{
        "id": 2,
        "gmtCreated": "2020-12-01 14:19:07",
        "gmtModified": "2020-12-08 16:35:05",
        "productCode": "QHM01",
        "insurerCode": "000208",
        "insurerName": "前海财险",
        "versionName": "前海投保",
        "versionCode": ""
    },{
        "id": 3,
        "gmtCreated": "2020-12-01 14:23:52",
        "gmtModified": "2020-12-08 16:35:06",
        "productCode": "AN07$2102099445",
        "insurerCode": "000179",
        "insurerName": "众安健康险",
        "versionName": "众安投保",
        "versionCode": ""
    },{
        "id": 4,
        "gmtCreated": "2020-12-02 18:51:34",
        "gmtModified": "2020-12-08 16:29:53",
        "productCode": "HHM01",
        "insurerCode": "000183",
        "insurerName": "华海财险",
        "versionName": "华海可回溯",
        "versionCode": "v2"
    },{
        "id": 5,
        "gmtCreated": "2020-12-04 17:45:00",
        "gmtModified": "2020-12-10 19:42:12",
        "productCode": "XDCM01",
        "insurerCode": "000184",
        "insurerName": "现代财月缴版",
        "versionName": "现代财投保",
        "versionCode": "v2"
    }
];
let arrayList = [{
				  id:'1',
				  name:'one'
				},{
				  id:'2',
				  name:'tow',
				},{
				  id:'3',
				  name:'three'
				},{
				  id:'1',
				  name:'one'
				},{
				  id:'2',
				  name:'tow',
				},{
				  id:'3',
				  name:'three'
				}]

list数组对象如上。

根据insurerCode,id字段进行去重。

下面列举能够实现的几种方法:
(1)方法一:循环判断

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
}

(2)方法二:利用对象属性唯一

function unique(arr, u_key) {
    const obj = {}
    const result = []
    arr.forEach(item => {
        const typeof_key = typeof item[u_key] + item[u_key]
        console.log(typeof_key);
        obj[typeof_key] = item
    })
    for (const key in obj) {
        result.push(obj[key])
    }
    return result
}

(3)方法三:利用ES6的Map方法

function unique(arr,u_key) {
      let map = new Map()
      arr.forEach((item,index)=>{
        if (!map.has(item[u_key])){
          map.set(item[u_key],item)
        }
      })
      return [...map.values()]
    }

(4)方法四:利用lodash库进行处理
如果项目中有引入lodash库的话,,就可以只用使用下面的uniqBy,传入对应的数组对象,和要根据的相关字段即可。

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

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

在这里插入图片描述

### JavaScript 中数组对象的方法 在 JavaScript 中,对于数组对象操作有多种实现方式。以下是几种常见的方法: #### 方法一:使用 `reduce` 和辅助对象 通过 `reduce` 方法可以遍历整个数组并构建一个新的无复项的结果集。此过程中可以通过一个临时对象来记录已经存在的键值。 ```javascript let newObj = {}; const repeatData = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 1, name: 'Alice' } ]; repeatData = repeatData.reduce((preVal, curVal) => { newObj[curVal.id] ? '' : newObj[curVal.id] = true && preVal.push(curVal); return preVal; }, []); console.log(repeatData, 'repeatData'); ``` 这种方法的核心在于利用了一个外部的对象 `newObj` 来存储已处理过的唯一标识符(如 `id`),从而避免复数据被加入最终结果集中[^1]。 --- #### 方法二:基于 ES6 的 `Set` 结构与自定义逻辑 虽然原生的 `Set` 只能用于简单类型的,但对于复杂对象也可以借助其特性配合其他手段完成目标。 ```javascript const arr = [ { name: 'zhangsan', age: 12 }, { name: 'lisi', age: 14 }, { name: 'zhangsan', age: 12 }, { name: 'lisi', age: 14 }, { name: 'zhangsan', age: 12 } ]; function uniqueByProperty(array, propertyKey) { const seen = new Set(); return array.filter(item => { const value = item[propertyKey]; if (seen.has(value)) { return false; } else { seen.add(value); return true; } }); } const result = uniqueByProperty(arr, 'name'); console.log(result); ``` 这里我们创建了一个名为 `uniqueByProperty` 的通用工具函数,它接受两个参数——待过滤的数组以及作为区分依据的关键字段名称。内部则运用到了集合类型 `Set` 来追踪哪些属性已经被遇到过[^2]。 --- #### 方法三:Map 数据结构的应用 另一种优雅的方式是采用 `Map` 这种高效的数据容器来进行快速查表式的判定工作。 ```javascript /** * @description: 对象数组 * @param arr 要数组 * @param key 根据某一个属性 * @return 后的数组 */ function removeSame(arr, prop) { let map = new Map(); // 创建新的映射实例 for (let item of arr) { !map.has(item[prop]) && map.set(item[prop], item); // 如果当前prop对应的值未存在,则存入 } return [...map.values()]; // 将所有value取出形成新数组返回 } const data = [ { id: 1, name: 'Tom' }, { id: 2, name: 'Jerry' }, { id: 1, name: 'Tom' } ]; console.log(removeSame(data, 'id')); ``` 上述代码片段展示了如何定义一个专门用来解决此类问题的小型库函数 `removeSame()` ,该函数接收原始数组及其指定属性名作输入,并输出经过适当筛选后的新列表[^3]。 --- ### 性能对比分析 每种方案都有各自的优缺点,在实际项目开发当中可以根据具体需求场景灵活选用最合适的那一种。比如当关注点放在执行效率上时可能更倾向于选择第三种;而如果追求简洁明了的话第二种也不失为一个好的选项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值