You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:36