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

如何对数组两两分组比较,筛选出order_id更大的元素?

如何筛选数组中每组两两元素里order_id更大的项

你的需求是将数组中的元素两两分组,比较每组内两个元素的order_id(格式如1.7.xxx),保留其中order_id更大的元素。你当前的代码逻辑错误,无法实现预期效果,以下是正确的解决方案:

问题分析

你使用filter时,判断条件是当前元素与前一个元素的order_id是否相等,这和“保留较大order_id元素”的需求完全不符,因此得不到正确结果。此外,order_id是点分隔的字符串,直接用字符串比较会出现逻辑错误(例如"1.7.100"字符串比较结果会小于"1.7.99"),必须转为数字数组逐位比较。

解决方案

1. 实现order_id比较工具函数

首先需要一个能正确比较这种分层ID的函数:

function compareOrderId(a, b) {
  const aParts = a.split('.').map(Number);
  const bParts = b.split('.').map(Number);
  
  for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
    const numA = aParts[i] || 0;
    const numB = bParts[i] || 0;
    if (numA > numB) return 1;
    if (numA < numB) return -1;
  }
  return 0; // 两个ID完全相等
}

2. 按顺序两两分组筛选

如果你的数组是按顺序两两成组(第0与第1为一组,第2与第3为一组,以此类推),使用以下代码:

const filtered = [];

for (let i = 0; i < histories.length; i += 2) {
  const current = histories[i];
  const next = histories[i + 1];
  
  if (!next) {
    // 处理数组长度为奇数的情况,直接保留最后单个元素
    filtered.push(current);
    continue;
  }
  
  // 比较并保留order_id更大的元素
  filtered.push(
    compareOrderId(current.op.order_id, next.op.order_id) >= 0 ? current : next
  );
}

console.log(filtered);

3. 按业务key分组保留最大项

如果你的需求是对相同业务key(示例中的base/quote/sequence组合)的元素,保留order_id最大的那一个,使用以下逻辑:

const groups = {};

histories.forEach(item => {
  // 生成业务key的唯一标识字符串
  const groupKey = `${item.key.base}-${item.key.quote}-${item.key.sequence}`;
  // 如果分组不存在,或当前元素的order_id更大,则替换分组内的元素
  if (!groups[groupKey] || compareOrderId(item.op.order_id, groups[groupKey].op.order_id) > 0) {
    groups[groupKey] = item;
  }
});

// 将分组结果转为数组
const filtered = Object.values(groups);
console.log(filtered);

内容的提问来源于stack exchange,提问作者sanjK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36