JavaScript:如何筛选对象数组中需删除的非匹配dt属性记录
实现方案
1. 获取需要删除的记录
首先把required_documents中所有的dt值提取到Set中(Set的查找效率远高于数组遍历),再过滤出existing_documents里不在这个集合中的记录:
// 提取所有需要保留的dt值 const requiredDts = new Set(required_documents.map(doc => doc.dt)); // 筛选出existing中dt不在required里的记录(即需要删除的) const docsToDelete = existing_documents.filter(doc => !requiredDts.has(doc.dt));
执行后docsToDelete会得到你需要的[{"id":3,"dt":4}]。
2. 获取需要插入的记录
如果要同步插入required_documents中未在existing_documents匹配到的记录(比如示例中的{"id":3,"dt":3}),可以用类似逻辑:
// 提取existing中已有的dt值 const existingDts = new Set(existing_documents.map(doc => doc.dt)); // 筛选出required中dt不在existing里的记录(即需要插入的) const docsToInsert = required_documents.filter(doc => !existingDts.has(doc.dt));
3. 按id关联的精准同步逻辑
如果你的业务是按id标识同一份文档(即id相同的是同一份文档,仅需同步dt属性),可以用更精准的匹配方式:
// 把required转成以id为键的对象,快速查找对应id的文档 const requiredById = required_documents.reduce((acc, doc) => { acc[doc.id] = doc; return acc; }, {}); // 找出需要删除的:existing中id不存在于required,或id存在但dt不匹配的记录 const docsToDelete = existing_documents.filter(doc => { const requiredDoc = requiredById[doc.id]; return !requiredDoc || requiredDoc.dt !== doc.dt; }); // 把existing转成以id为键的对象 const existingById = existing_documents.reduce((acc, doc) => { acc[doc.id] = doc; return acc; }, {}); // 找出需要插入的:required中id不存在于existing,或id存在但dt不匹配的记录 const docsToInsert = required_documents.filter(doc => { const existingDoc = existingById[doc.id]; return !existingDoc || existingDoc.dt !== doc.dt; });
内容的提问来源于stack exchange,提问作者snowflakes74
相关产品推荐
相关产品推荐

