如何在Jsonata中基于两个值过滤对象数组?
基于双字段过滤数组重复对象的实现方法
给定如下数组,其中部分对象的num和name字段组合存在重复,需要过滤掉一组num:"999"且name:"thing A"的重复项,最终返回4个对象:
{"array":[{"id":"1","num":"999","name":"thing A"},{"id":"2","num":"888","name":"thing A"},{"id":"3","num":"777","name":"thing B"},{"id":"4","num":"999","name":"thing A"},{"id":"5","num":"999","name":"thing B"}]}
实现思路
通过记录num与name的组合标识,遍历数组时只保留该组合第一次(或最后一次)出现的对象,即可完成双字段去重。
代码实现(JavaScript)
1. 保留第一个出现的重复项(移除第4个对象)
const input = {"array":[{"id":"1","num":"999","name":"thing A"},{"id":"2","num":"888","name":"thing A"},{"id":"3","num":"777","name":"thing B"},{"id":"4","num":"999","name":"thing A"},{"id":"5","num":"999","name":"thing B"}]}; const seen = new Set(); const result = { array: input.array.filter(item => { const key = `${item.num}-${item.name}`; if (seen.has(key)) return false; seen.add(key); return true; }) }; console.log(JSON.stringify(result));
输出结果:
{"array":[{"id":"1","num":"999","name":"thing A"},{"id":"2","num":"888","name":"thing A"},{"id":"3","num":"777","name":"thing B"},{"id":"5","num":"999","name":"thing B"}]}
2. 保留最后一个出现的重复项(移除第1个对象)
const input = {"array":[{"id":"1","num":"999","name":"thing A"},{"id":"2","num":"888","name":"thing A"},{"id":"3","num":"777","name":"thing B"},{"id":"4","num":"999","name":"thing A"},{"id":"5","num":"999","name":"thing B"}]}; const seen = new Map(); // 遍历数组,记录每个组合最后出现的对象 input.array.forEach(item => { const key = `${item.num}-${item.name}`; seen.set(key, item); }); // 将Map中的值转为数组 const result = { array: Array.from(seen.values()) }; console.log(JSON.stringify(result));
输出结果:
{"array":[{"id":"4","num":"999","name":"thing A"},{"id":"2","num":"888","name":"thing A"},{"id":"3","num":"777","name":"thing B"},{"id":"5","num":"999","name":"thing B"}]}
内容的提问来源于stack exchange,提问作者HobieKatz
相关产品推荐
相关产品推荐

