如何基于两个属性移除数组对象中的重复项及对应原始值
实现方案
实现逻辑分为两步:
- 先统计所有
room_rate_type_id+price组合的出现次数 - 再过滤出仅出现过1次的组合对应的条目
完整实现代码
const rooms = [ { room_rate_type_id: 202, price: 200 }, { room_rate_type_id: 202, price: 200 }, { room_rate_type_id: 202, price: 189 }, { room_rate_type_id: 190, price: 200 } ]; // 统计每个组合的出现次数 const countMap = {}; rooms.forEach(item => { const uniqueKey = `${item.room_rate_type_id}_${item.price}`; countMap[uniqueKey] = (countMap[uniqueKey] || 0) + 1; }); // 过滤仅保留无重复的条目 const result = rooms.filter(item => { const uniqueKey = `${item.room_rate_type_id}_${item.price}`; return countMap[uniqueKey] === 1; }); console.log(result);
执行后输出结果和你期望的一致:
[ { room_rate_type_id: 202, price: 189 }, { room_rate_type_id: 190, price: 200 } ]
优化版(仅遍历一次原数组,适合大数据量场景)
const tempMap = new Map(); rooms.forEach(item => { const uniqueKey = `${item.room_rate_type_id}_${item.price}`; if (tempMap.has(uniqueKey)) { tempMap.get(uniqueKey).count++; } else { tempMap.set(uniqueKey, { count: 1, data: item }); } }); const result = Array.from(tempMap.values()) .filter(item => item.count === 1) .map(item => item.data);
你原有代码不满足需求的原因是:原有逻辑仅会把重复组里除了第一次出现之外的条目删掉,不会把整个重复组全部排除。
内容的提问来源于stack exchange,提问作者MOz
相关产品推荐
相关产品推荐

