多级对象数组去重与过滤:保留非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
相关产品推荐
相关产品推荐

