js去除数组中的重复项

本文介绍了一种使用JavaScript去除数组中重复对象的有效方法。通过利用reduce方法结合哈希表原理,确保每个唯一对象只保留一次出现。这种方法适用于需要处理大量相似数据的场景。

去除数组中的重复项

var arr = [{
    "name": "ZYTX",
    "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
    "gender": "AAAAAA.doc"
}, {
    "name": "ZYTA",
    "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
    "gender": "BBBBBB.doc"
}, {
    "name": "ZDTX",
    "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
    "gender": "CCCCCC.doc"
}, {
    "name": "ZYTX",
    "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
    "gender": "AAAAAA.doc"
}];
var hash = {};
arr = arr.reduce(function(item, next) {
    hash[next.name] ? '' : hash[next.name] = true && item.push(next);
    return item
}, [])
console.log(arr);
// [
//     {
//       name: 'ZYTX',
//       age: 'Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix',
//       gender: 'AAAAAA.doc'
//     },
//     {
//       name: 'ZYTA',
//       age: 'Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix',
//       gender: 'BBBBBB.doc'
//     },
//     {
//       name: 'ZDTX',
//       age: 'Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix',
//       gender: 'CCCCCC.doc'
//     }
//   ]
在 JavaScript 中,除数中对象的重复项相较于基本类型(如数字、字符串)更为复杂,因为对象是引用类型。直接比较两个对象是否相等时,JavaScript 会基于引用地址进行判断,而不是其内容[^1]。 ### 使用 `reduce()` 和自定义键匹配重 可以通过一个累加器来保存唯一对象,并使用 `JSON.stringify()` 将对象序列化为字符串形式以便于比较。这种方式可以有效识别结构相同但引用不同的对象。 ```javascript function removeDuplicateObjects(arr) { return arr.reduce((acc, current) => { const exists = acc.some(item => JSON.stringify(item) === JSON.stringify(current)); if (!exists) { acc.push(current); } return acc; }, []); } const originalArray = [ { place: "here", name: "stuff" }, { place: "there", name: "morestuff" }, { place: "here", name: "stuff" } ]; const uniqueArray = removeDuplicateObjects(originalArray); console.log(uniqueArray); // 输出: [ { place: 'here', name: 'stuff' }, { place: 'there', name: 'morestuff' } ] ``` 这种方法通过遍历数组并检查当前对象是否已经存在于新数组中实现重操作。它适用于小型数据集且对象结构较为简单的情况[^2]。 ### 使用 `Map` 或 `Set` 进行重 另一种方法是利用 `Map` 来存储已处理的对象,以提升查找效率。通过将对象转换为字符串作为键,避免了线性查找带来的性能损耗。 ```javascript function removeDuplicateObjects(arr) { const seen = new Map(); return arr.filter(item => { const key = JSON.stringify(item); if (seen.has(key)) { return false; } else { seen.set(key, true); return true; } }); } const originalArray = [ { place: "here", name: "stuff" }, { place: "there", name: "morestuff" }, { place: "here", name: "stuff" } ]; const uniqueArray = removeDuplicateObjects(originalArray); console.log(uniqueArray); // 输出: [ { place: 'here', name: 'stuff' }, { place: 'there', name: 'morestuff' } ] ``` 此方法通过 `Map` 存储已出现的对象键,大幅减少了查找时间,适用于较大或较复杂的对象数组重场景[^3]。 ### 注意事项与限制 - 上述方法依赖于 `JSON.stringify()` 对对象进行序列化,因此无法处理包含函数、`undefined`、循环引用等特殊结构的对象。 - 如果对象中存在嵌套结构(例如多层嵌套对象或数组),这些方法依然适用,前提是所有属性都可以被正确序列化。 - 在某些极端情况下(如大量数据),应考虑引入更高效的哈希算法或使用专门的数据结构(如 Immutable.js 提供的集合类型)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值