You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript/TypeScript中按多属性过滤对象数组并保留有效最新版本?

过滤对象数组:保留各名称下有效且版本最高的条目并维持原顺序

要实现仅保留每个名称下invalid: false且版本号最高的对象,同时维持原数组中名称的出现顺序,你可以按以下步骤操作:

核心思路

  1. 先过滤掉所有无效数据(直接排除invalid: true的条目)
  2. 为每个名称记录当前找到的最高版本条目
  3. 依据原数组中名称的首次出现顺序提取最终结果,保证顺序不变

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:09:25