如何在JavaScript/TypeScript中按多属性过滤对象数组并保留有效最新版本?
过滤对象数组:保留各名称下有效且版本最高的条目并维持原顺序
要实现仅保留每个名称下invalid: false且版本号最高的对象,同时维持原数组中名称的出现顺序,你可以按以下步骤操作:
核心思路
- 先过滤掉所有无效数据(直接排除
invalid: true的条目) - 为每个名称记录当前找到的最高版本条目
- 依据原数组中名称的首次出现顺序提取最终结果,保证顺序不变
代码实现
const arr = [ { name: 'John', invalid: false, version: 1 }, { name: 'John', invalid: false, version: 2 }, { name: 'John', invalid: true, version: 1 }, { name: 'John', invalid: true, version: 5 }, { name: 'John', invalid: true, version: 2 }, { name: 'Samuel', invalid: false, version: 1 }, { name: 'Samuel', invalid: false, version: 2 }, { name: 'Samuel', invalid: true, version: 1 }, ]; // 1. 筛选所有有效数据 const validItems = arr.filter(item => !item.invalid); // 2. 记录每个name对应的最高版本条目 const maxVersionMap = {}; for (const item of validItems) { // 若当前name未记录,或当前条目版本更高则更新 if (!maxVersionMap[item.name] || item.version > maxVersionMap[item.name].version) { maxVersionMap[item.name] = item; } } // 3. 获取原数组中去重的name顺序(维持原出现顺序) const uniqueNames = [...new Set(arr.map(item => item.name))]; // 生成最终结果 const result = uniqueNames.map(name => maxVersionMap[name]); console.log(result);
输出结果
[ { name: 'John', invalid: false, version: 2 }, { name: 'Samuel', invalid: false, version: 2 } ]
补充说明
- 第一步过滤有效数据是基础,避免无效条目干扰版本判断
- 用对象做映射表的方式时间复杂度为O(n),执行效率高
- 通过
new Set获取原数组的name顺序,确保最终结果的顺序和原数组中名称首次出现的顺序一致
内容的提问来源于stack exchange,提问作者Dontlookatme
相关产品推荐
相关产品推荐

