如何提取JavaScript数组中连续递增的步数记录条目?
如何捕获连续递增序列的所有条目(包括最后一个元素)
你的问题很典型——当前代码只捕获了连续递增对中的前一个元素,但序列的最后一个元素因为没有下一个元素可以比较,永远不会被加入数组。比如你提到的前三个条目(索引0、1、2)是连续递增的,你的代码会加入索引0和1,但索引2因为和索引3的元素不满足递增,所以被遗漏了。
下面提供两种解决思路,你可以根据需求选择:
方法一:跟踪连续递增区间(推荐)
这种方法通过标记递增序列的起始位置,当遇到递增中断时,把整个区间的元素一次性加入结果数组,最后再处理末尾的递增序列。逻辑清晰,适合处理多个不连续的递增段:
let dates = []; // 处理空数组的边界情况 if (this.entries.length === 0) return dates; let startIndex = 0; for (let i = 1; i < this.entries.length; i++) { // 当当前元素不大于前一个时,说明递增序列结束 if (this.entries[i].numSteps <= this.entries[i - 1].numSteps) { // 将从startIndex到i-1的所有元素加入结果 dates.push(...this.entries.slice(startIndex, i)); // 更新递增序列的起始位置为当前索引 startIndex = i; } } // 处理最后一段未被处理的递增序列 dates.push(...this.entries.slice(startIndex));
逻辑说明:
- 遍历数组时,一旦发现当前元素不大于前一个,就把之前的连续递增段(
startIndex到i-1)全部加入结果。 - 循环结束后,别忘了处理最后一段可能存在的递增序列(比如数组末尾的连续递增元素)。
方法二:逐个判断元素是否属于递增序列
这种方法直接判断每个元素是否是递增序列的一部分:要么它的下一个元素比它大(属于递增过程中),要么它的前一个元素比它小(是递增序列的结尾):
let dates = []; for (let i = 0; i < this.entries.length; i++) { const currentEntry = this.entries[i]; // 判断当前元素是否在连续递增序列中: // 1. 不是最后一个元素,且当前步数 < 下一个步数 // 2. 不是第一个元素,且当前步数 > 前一个步数 const isInIncreasingSequence = (i < this.entries.length - 1 && currentEntry.numSteps < this.entries[i + 1].numSteps) || (i > 0 && currentEntry.numSteps > this.entries[i - 1].numSteps); if (isInIncreasingSequence) { dates.push(currentEntry); } }
逻辑说明:
- 对于连续递增的序列
a < b < c:a满足“下一个元素更大”,被加入;b同时满足两个条件,被加入;c满足“前一个元素更小”,被加入;
- 对于非递增的元素(比如序列中的递减点),两个条件都不满足,不会被加入。
测试你的示例数据:
用你的entries数组测试,两种方法都会正确捕获前三个条目(2019/06/15、2019/06/16、2019/06/17),以及其他连续递增段的所有元素。
内容的提问来源于stack exchange,提问作者Cody Smith
相关产品推荐
相关产品推荐

