问题描述
我有下面这样的数组。
[1,2,3,10,15,24,25,26,27]
我想要的是过滤掉不连续的数字,不包括系列中的第一个数字,但保留像下面这样的系列中的最后一个。
[2,27]
我是编码新手,我还不确定如何编写此代码,但我已经模拟了伪代码,请您检查一下,看看我的逻辑是否正常?
var startArray = [1,27];
Var endarray = [ ];
循环:而起始数组中还有数字
GET:startArray的第一个数字
IF:数组中的当前数+1减去数组中的当前数-1 === 2
PUSH:当前数字到endarray
ELSE IF: 当前数字 -1 ===1
PUSH:当前数字到endarray
END IF
结束循环
感谢您的帮助。
解决方法
您只需要遍历所有内容并简单地检查当前数字是否比前一个数字大一。如果是这样,请将其推送到您的结果数组:
var startArray = [1,2,3,10,15,24,25,26,27];
var endArray = [];
for(var i = 0; i < startArray.length; i++) {
if(startArray[i] - 1 === startArray[i - 1]) {
endArray.push(startArray[i]);
}
}
$.writeln(endArray); // => 2,27
,
这是我想出来的。
const start = [1,27];
let end = new Array(),i = 0;
while (i < start.length) {
let j = 2;
if (start[i+j-2] + 1 == start[i+j-1])
end.push(start[i+j-2],start[i+j-1]);
else { i++; continue; }
while (i+j < start.length && start[i+j-1] + 1 == start[i+j])
end.push(start[i+j++]);
i += j;
}
说明:第一个 while 循环遍历每个连续数字序列。变量j
首先用于检查期望序列的第一个和第二个元素,如果它们不连续,则将i
增加1,改变下一个期望序列的起点连续数字。如果它们是连续的数字,它会将它们都推送到 end
数组中,并继续嵌套循环,该循环检查当前序列的 j-1
元素 ( 始终具有第一个元素 { {1}} ) 和 i
元素是连续的,如果是,则将序列的 j
元素添加到 j
数组中。最后,当嵌套循环执行完毕后,它将 end
添加到 j
,以更改下一个序列的起点。
i
我知道解释很乱,但希望能帮助你理解。
,我们可以使用数组内置方法filter
。评论中的解释。
const start = [1,27]
const result = start.filter((el,i) => {
// if `el` is the any element in consecutive sequence except the first
if (el - 1 === start[i - 1]) return true
// else it is consecutive sequence of size 1 (10,15) in the example,// or it is first element in consecutive sequence of size greater than 1
return false
})
console.log(result)