如何基于另一数组匹配模式对对象数组进行分组替换与去重
实现方案:匹配应用名称并去重替换
需求说明
给定两个数组:
data:存储带后缀的应用名称对象数组Appdata:存储标准应用名称的数组
需要完成:
- 遍历
data,将所有包含Appdata中名称的项替换为对应标准名称 - 保留不匹配的原始项
- 最终结果去重,每个标准名称仅保留一个,不匹配项也保留唯一实例
示例数据
const data = [ { "Application": "Chrome - 567" }, { "Application": "File Transfer Protocol - 45" }, { "Application": "Google APIs - 3618" }, { "Application": "Google Generic - 943" }, { "Application": "Google Search - 54" }, { "Application": "Microsoft - 2821" }, { "Application": "Microsoft DFSR (Distributed File System Replication) - 3722" }, { "Application": "Microsoft Remote Procedure Call - 742" }, { "Application": "Telegram- 2235" }, { "Application": "Facebook Videos - 2250" }, { "Application": "Facebook - 690" } ]; const Appdata = ["Google", "Facebook", "Instagram", "Microsoft", "Telegram"];
实现代码
// 用Set记录已处理的标准名称,避免重复 const processedApps = new Set(); const result = []; // 先处理需要替换的标准应用名称 Appdata.forEach(appName => { const hasMatch = data.some(item => item.Application.includes(appName)); if (hasMatch && !processedApps.has(appName)) { result.push({ Application: appName }); processedApps.add(appName); } }); // 处理不匹配的项,同时去重 const unprocessedItems = new Set(); data.forEach(item => { const appValue = item.Application; const isMatched = Appdata.some(name => appValue.includes(name)); if (!isMatched && !unprocessedItems.has(appValue)) { result.push(item); unprocessedItems.add(appValue); } }); console.log(result);
代码逻辑解释
- 处理标准名称项:遍历
Appdata,检查data中是否存在包含该名称的项,若存在且未添加过,则将标准名称对象加入结果数组,并标记为已处理。 - 处理不匹配项:遍历
data,判断当前项是否不匹配任何Appdata中的名称,若未添加过则加入结果数组,用Set确保去重。 - 去重机制:使用
Set分别记录已添加的标准名称和未匹配项,避免重复出现。
预期输出
[ { "Application": "Google" }, { "Application": "Facebook" }, { "Application": "Microsoft" }, { "Application": "Telegram" }, { "Application": "Chrome - 567" }, { "Application": "File Transfer Protocol - 45" } ]
内容的提问来源于stack exchange,提问作者Bharat Mane
相关产品推荐
相关产品推荐

