JavaScript对象数组按id趋势分组并添加IDS标记的需求实现咨询
JavaScript对象数组按id趋势分组并添加IDS标记的需求实现咨询
嗨,我仔细分析了你给出的输入数组和期望输出,先帮你明确一下从示例里反推出来的分组规则,再给出对应的JavaScript实现:
从示例总结的分组规则
- 初始
IDS从1开始,第一个元素直接标记IDS:1 - 当出现以下两种情况时,开启新分组,
IDS值递增1:- 当前元素的
id比前一个元素的id小,且前一个元素的id是当前分组的最大值 - 当前元素的
id比前一个元素的id大,且前一个元素的id是当前分组的最小值
- 当前元素的
- 其他情况(比如当前元素在分组的最小/最大值之间波动),都属于当前分组,
IDS保持不变
这个规则完美匹配你给出的示例输出:
- 第一组
id从1递增到5(最大值5),后续遇到id:4(比5小),开启新分组IDS:2 - 第二组
id从4又回到5(最大值5),后续遇到id:4(比5小),开启新分组IDS:3 - 第三组
id从4递减到2(最小值2),后续遇到id:3(比2大),开启新分组IDS:4 - 第四组
id从3回到2,属于当前分组,保持IDS:4
实现代码
const lists = [ { price:10, id:1}, { price:11, id:2}, { price:12, id:3}, { price:13, id:4}, { price:14, id:5}, { price:12, id:4}, { price:12, id:5}, { price:11, id:4}, { price:10, id:3}, { price:9, id:2}, { price:12, id:3}, { price:12, id:2}, ]; // 处理空数组的边界情况 if (lists.length === 0) { console.log([]); } // 初始化结果数组,第一个元素标记IDS=1 const result = [{...lists[0], IDS: 1}]; // 跟踪当前分组的最小、最大id,以及当前IDS值 let currentMin = lists[0].id; let currentMax = lists[0].id; let currentIDS = 1; // 从第二个元素开始遍历处理 for (let i = 1; i < lists.length; i++) { const currentId = lists[i].id; const prevId = lists[i-1].id; let needNewGroup = false; // 判断是否需要开启新分组 if (currentId < prevId && prevId === currentMax) { needNewGroup = true; } else if (currentId > prevId && prevId === currentMin) { needNewGroup = true; } if (needNewGroup) { // 开启新分组,更新IDS和当前分组的最小/最大值 currentIDS++; currentMin = currentId; currentMax = currentId; } else { // 更新当前分组的最小/最大值 currentMin = Math.min(currentMin, currentId); currentMax = Math.max(currentMax, currentId); } // 将当前元素添加到结果数组 result.push({...lists[i], IDS: currentIDS}); } // 输出结果 console.log(result);
运行结果
这段代码运行后会输出你期望的结果:
[ { price: 10, id: 1, IDS: 1 }, { price: 11, id: 2, IDS: 1 }, { price: 12, id: 3, IDS: 1 }, { price: 13, id: 4, IDS: 1 }, { price: 14, id: 5, IDS: 1 }, { price: 12, id: 4, IDS: 2 }, { price: 12, id: 5, IDS: 2 }, { price: 11, id: 4, IDS: 3 }, { price: 10, id: 3, IDS: 3 }, { price: 9, id: 2, IDS: 3 }, { price: 12, id: 3, IDS: 4 }, { price: 12, id: 2, IDS: 4 } ]
如果这个规则和你实际想要的有出入,比如你对(4,5)和(3,2)部分有其他逻辑要求,可以再补充描述细节,我再帮你调整代码~
备注:内容来源于stack exchange,提问作者Ben Davidsson
相关产品推荐
相关产品推荐

