如何对数组两两分组比较,筛选出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
相关产品推荐
相关产品推荐

