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

多级对象数组去重与过滤:保留非null flaggedItem并移除重复id项

解决方案

要同时实现过滤flaggedItem不为null的条目和移除items.id重复项,你需要跳出单独处理每个外层对象的局限,先全局收集有效条目再去重,具体实现如下:

方式1:直接获取去重后的最终条目列表(符合你预期的2个结果)

// 第一步:收集所有flaggedItem不为null的items
const validItems = myDatas?.flatMap(data => 
  data.items?.filter(item => item.flaggedItem !== null) || []
) || [];

// 第二步:基于id去重,保留首次出现的条目
const uniqueItems = [...new Map(validItems.map(item => [item.id, item])).values()];

console.log(uniqueItems);
// 输出结果:
// [
//   { id: "idTwo", flaggedItem: 1 },
//   { id: "idOne", flaggedItem: 2 }
// ]

方式2:保留原外层结构,同时移除重复条目

如果需要保留原有的myDatas层级结构,仅保留包含有效且未重复条目的对象:

const seenItemIds = new Set();

const processedDatas = myDatas?.map(data => {
  const filteredItems = (data.items?.filter(item => {
    // 过滤flaggedItem为null的条目
    if (item.flaggedItem === null) return false;
    // 过滤已出现过的id
    if (seenItemIds.has(item.id)) return false;
    seenItemIds.add(item.id);
    return true;
  }) || []);
  return { ...data, items: filteredItems };
// 移除没有有效条目的外层对象
}).filter(data => data.items.length > 0);

console.log(processedDatas);
// 输出结果:
// [
//   { id: "id1", items: [{ id: "idTwo", flaggedItem: 1 }] },
//   { id: "id2", items: [{ id: "idOne", flaggedItem: 2 }] }
// ]

原代码问题说明

你之前的代码仅对每个外层对象的items单独做了过滤,没有全局跟踪已出现的id,因此无法实现跨对象的去重逻辑。上述方案通过全局收集或全局记录已出现的id,解决了这个问题。

内容的提问来源于stack exchange,提问作者programmerGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:07:42