如何筛选Array 2中不存在于Array 1的id并保留对应嵌套结构?
解决嵌套数组的过滤需求
首先,我们明确核心需求:从Array 2的嵌套结构里,移除所有在Array 1中出现过的id对应的子项;如果某个分类下的子项被全部移除,就删掉整个分类项,最终保留符合条件的内容。
实现步骤拆解
- 第一步:提取Array 1中所有的
id,存入一个Set集合(Set的查找效率远高于数组,适合做重复值判断)。 - 第二步:遍历Array 2的外层分类列表,对每个分类下的子列表进行过滤,只保留
id不在Set里的项。 - 第三步:过滤掉那些子列表为空的分类项,确保最终结果里没有空分类。
代码示例(JavaScript)
// 模拟输入的两个嵌套结构 const array1 = {"list":{"0":{"category":"Cat fr 1","list":{"0":{"id":123123123123},"1":{"id":123123123124}}}}}; const array2 = {"list":{"0":{"category":"Cat fr 1","list":{"0":{"id":123123123123},"1":{"id":123123123124}}},"1":{"category":"Cat fr 2","list":{"0":{"id":123123123125},"1":{"id":123123123126}}},"2":{"category":"Cat fr 3","list":{"0":{"id":123123123127},"1":{"id":123123123128}}}}}; // 1. 提取Array1中所有id存入Set const existingIds = new Set(); Object.values(array1.list).forEach(category => { Object.values(category.list).forEach(item => { existingIds.add(item.id); }); }); // 2. 处理Array2,过滤符合条件的内容 const filteredResult = { list: {} }; let resultIdx = 0; Object.values(array2.list).forEach(category => { // 过滤当前分类下不在Array1中的id项 const validSubItems = Object.values(category.list).filter(item => !existingIds.has(item.id)); // 只有当过滤后还有子项时,才保留这个分类 if (validSubItems.length > 0) { // 把过滤后的子项转回原有的带索引的对象结构 const subListObj = {}; validSubItems.forEach((item, idx) => { subListObj[idx] = item; }); filteredResult.list[resultIdx] = { category: category.category, list: subListObj }; resultIdx++; } }); console.log(filteredResult);
代码细节说明
- 用
Set存储id是为了优化查找性能,数据量越大,这个优势越明显。 - 处理时先用
Object.values把对象形式的列表转成数组,方便遍历和过滤;处理完成后再转回带索引的对象,保持和原输入一致的结构格式。 - 最终结果会自动去掉所有子项被完全过滤的分类,和你给出的期望结果完全匹配。
内容的提问来源于stack exchange,提问作者Lộc Đặng Hữu
相关产品推荐
相关产品推荐

