如何为数组筛选添加条件?能否用indexOf筛选特定重复对象?
问题解答
直接用indexOf没法实现这个需求。原因是indexOf判断元素相等是基于严格相等(===),数组里的对象哪怕内容完全一致,也是不同的引用地址,indexOf只会找到和目标对象引用完全相同的元素,没法通过属性内容匹配来检测重复。
不过可以用以下几种方式实现你的需求:
方法一:直接统计目标条件的对象数量
遍历数组,统计符合ID=123、status=ACTIVE、date=2023-01-01的对象个数,只要数量大于1就执行输出:
// 示例数组 const objArr = [ { id: 123, status: 'ACTIVE', date: '2023-01-01' }, { id: 123, status: 'ACTIVE', date: '2023-01-01' }, { id: 456, status: 'INACTIVE', date: '2023-01-02' } ]; // 统计符合条件的对象数量 const matchCount = objArr.reduce((count, item) => { if (item.id === 123 && item.status === 'ACTIVE' && item.date === '2023-01-01') { return count + 1; } return count; }, 0); // 数量大于1则执行操作 if (matchCount > 1) { console.log('存在符合条件的重复对象'); // 同时可以筛选出这些对象 const targetDuplicates = objArr.filter(item => item.id === 123 && item.status === 'ACTIVE' && item.date === '2023-01-01' ); console.log('筛选结果:', targetDuplicates); }
方法二:用哈希表记录组合键出现次数
把id、status、date拼接成唯一键,用哈希表统计每个键的出现次数,后续修改条件也更灵活:
const objArr = [ { id: 123, status: 'ACTIVE', date: '2023-01-01' }, { id: 123, status: 'ACTIVE', date: '2023-01-01' }, { id: 123, status: 'INACTIVE', date: '2023-01-01' } ]; const keyMap = new Map(); // 目标条件对应的组合键 const targetKey = '123_ACTIVE_2023-01-01'; // 遍历数组统计键的出现次数 objArr.forEach(item => { const currentKey = `${item.id}_${item.status}_${item.date}`; keyMap.set(currentKey, (keyMap.get(currentKey) || 0) + 1); }); // 检查目标键的出现次数 if (keyMap.get(targetKey) > 1) { console.log('存在符合条件的重复对象'); const targetDuplicates = objArr.filter(item => `${item.id}_${item.status}_${item.date}` === targetKey ); console.log('筛选结果:', targetDuplicates); }
硬套indexOf的折中方案(不推荐)
如果一定要用indexOf的思路,只能先把对象转成可比较的字符串(比如JSON字符串),但这种方式有局限性:对象属性顺序不同时,JSON字符串会不一样,导致匹配失败。示例代码:
const objArr = [ { id: 123, status: 'ACTIVE', date: '2023-01-01' }, { id: 123, status: 'ACTIVE', date: '2023-01-01' } ]; // 把目标条件转成JSON字符串 const targetStr = JSON.stringify({ id: 123, status: 'ACTIVE', date: '2023-01-01' }); // 把数组所有对象转成JSON字符串 const strArr = objArr.map(item => JSON.stringify(item)); // 找第一个匹配位置,再从下一位找第二个匹配 const firstIdx = strArr.indexOf(targetStr); const secondIdx = strArr.indexOf(targetStr, firstIdx + 1); if (secondIdx !== -1) { console.log('存在符合条件的重复对象'); const targetDuplicates = objArr.filter(item => JSON.stringify(item) === targetStr); console.log('筛选结果:', targetDuplicates); }
内容的提问来源于stack exchange,提问作者Cphml444
相关产品推荐
相关产品推荐

