如何根据对象属性值移除JavaScript对象数组中的重复对象
JavaScript 按对象属性值给对象数组去重
针对示例中按邮箱属性去重的需求,推荐使用时间复杂度为O(n)的Set/Map记录方案,性能远优于双重循环比对的实现。
实现代码(保留第一次出现的重复项)
示例数据中每个对象以人名为键、邮箱为值,直接取对象的第一个属性值作为去重判断依据即可:
var data = [ { "John Doe": "john33@gmail.com" }, { "William Smith": "william65@gmail.com" }, { "Robert Johnson": "robert99@gmail.com" }, { "John Smith": "john33@gmail.com" }, { "James Johnson": "james8@gmail.com" }, ]; var seen = new Set(); var uniqueData = data.filter(function(item) { // 取出当前对象的邮箱值 var currentValue = Object.values(item)[0]; // 未出现过则保留,否则过滤 if (!seen.has(currentValue)) { seen.add(currentValue); return true; } return false; });
运行后uniqueData会移除John Smith对应的重复邮箱条目,最终返回4条无重复邮箱的记录。
变体:保留最后一次出现的重复项
如果需要保留重复值中最后一次出现的对象,可以用Map直接覆盖同值的存储记录:
var valueMap = new Map(); data.forEach(function(item) { var currentValue = Object.values(item)[0]; // 同值直接覆盖,最终存的就是最后一次出现的对象 valueMap.set(currentValue, item); }); var uniqueDataKeepLast = Array.from(valueMap.values());
适配固定属性名的场景
如果你的对象结构是固定属性名(比如统一用email字段存邮箱,格式为{ name: "John Doe", email: "john33@gmail.com" }),只需要把取值逻辑从Object.values(item)[0]替换为item.email即可,逻辑更稳定。
内容的提问来源于stack exchange,提问作者Syed Kazim Ali Shah
相关产品推荐
相关产品推荐

