JavaScript实现按Tag_No和PlatformID对数组对象去重
基于两个字段组合的数组对象去重(模拟SQL GROUP BY Tag_No + PlatformID)
需要实现对数组中对象按Tag_No与PlatformID的组合去重:只有当两个字段同时相同时才视为重复,保留每个组合的第一个出现项,效果等价于SQL里的GROUP BY Tag_No, PlatformID。
你现有代码仅通过单个Tag_No字段判断去重,会错误过滤掉同Tag_No但不同PlatformID的有效项——比如xxx05搭配PlatformID:5和PlatformID:12本应都被保留,但原代码只会留下第一个xxx05的条目。
修正方案1:修改原有循环逻辑
把缓存的判断键改成两个字段的组合字符串,同时修正空数组判断的错误:
var NewTag = [ {Tag_No:'xxx01',PlatformID:'12',Details:'example1'}, {Tag_No:'xxx02',PlatformID:'13',Details:'example2'}, {Tag_No:'xxx03',PlatformID:'14',Details:'example3'}, {Tag_No:'xxx05',PlatformID:'5',Details:'example4'}, {Tag_No:'xxx05',PlatformID:'12',Details:'example5'}, {Tag_No:'xxx05',PlatformID:'12',Details:'example6'}, ]; var tmp = {}; var result = []; // 修正原代码的空数组判断:数组是引用类型,不能直接和[]比较 if (NewTag && NewTag.length > 0) { for (var i = 0; i < NewTag.length; i++) { var val = NewTag[i]; // 生成唯一组合键 var uniqueKey = `${val.Tag_No}_${val.PlatformID}`; if (!tmp[uniqueKey]) { tmp[uniqueKey] = true; result.push(val); } } } console.log('result', result);
修正方案2:ES6简洁实现(推荐)
利用Set存储已出现的组合键,结合filter方法快速过滤:
const NewTag = [ {Tag_No:'xxx01',PlatformID:'12',Details:'example1'}, {Tag_No:'xxx02',PlatformID:'13',Details:'example2'}, {Tag_No:'xxx03',PlatformID:'14',Details:'example3'}, {Tag_No:'xxx05',PlatformID:'5',Details:'example4'}, {Tag_No:'xxx05',PlatformID:'12',Details:'example5'}, {Tag_No:'xxx05',PlatformID:'12',Details:'example6'}, ]; const seenKeys = new Set(); const result = NewTag.filter(item => { const key = `${item.Tag_No}_${item.PlatformID}`; if (!seenKeys.has(key)) { seenKeys.add(key); return true; } return false; }); console.log('result', result);
两种方案最终都会输出你期望的结果:
result=[{Tag_No:'xxx01',PlatformID:'12',Details:'example1'}, {Tag_No:'xxx02',PlatformID:'13',Details:'example2'}, {Tag_No:'xxx03',PlatformID:'14',Details:'example3'}, {Tag_No:'xxx05',PlatformID:'5',Details:'example4'}, {Tag_No:'xxx05',PlatformID:'12',Details:'example5'}, ]
内容的提问来源于stack exchange,提问作者Ariff Naj
相关产品推荐
相关产品推荐

