为什么在JavaScript中拼接数组删除最后几个元素?



我目前正在研究一个数组函数,该函数将连续数字的子数组转换为表示该数字范围的字符串-例如,这个数组…

[1, 2, 3, 6, 8, 10, 11, 12, 15, 18]

…将变成this数组:

["1-3", 6, 8, "10-12", 15, 18]

我已经能够开发一个大部分工作的函数,但是我遇到了一个奇怪的错误,其中所有超过拼接到数组中的最终数字范围的元素都被完全删除了。例如,上面的测试数组实际上变成了:

["1-3", 6, 8, "10-12"]

这是我目前为止写的代码。它还不是非常漂亮,但正如我上面提到的,它完成了直到最后的工作:

let testArray = [1, 2, 3, 6, 8, 10, 11, 12, 15, 18];
for (i = 0; i < testArray.length; i++) {
let consecutives = [];
consecutives.push(testArray[i]);
let j = i + 1;
while (j < testArray.length) {
if (testArray[j] == (testArray[j - 1] + 1)) {
consecutives.push(testArray[j]);
j++;
} else {
break;
}
}
if (consecutives.length > 2) {
let range = String(testArray[i]) + "-" + String(testArray[j - 1]);
console.log(testArray);
console.log(testArray[i]);
console.log(testArray[j]);
testArray.splice(i, j, range);
}
}
console.log(testArray);

这些是该代码输出的控制台日志:

Array(10) [ 1, 2, 3, 6, 8, 10, 11, 12, 15, 18 ]
1
6
Array(8) [ "1-3", 6, 8, 10, 11, 12, 15, 18 ]
10
15
Array(4) [ "1-3", 6, 8, "10-12" ]

我最初认为这是由数组索引混淆引起的,但是玩弄index-1s还没有解决这个问题。其他人在JavaScript的拼接中遇到过类似的问题吗?如果有,您是如何使其工作的?

问题在于一行代码:

testArray.splice(i, j, range);

根据MDN,第二个参数指定数组中要删除的元素个数。

deleteCount

一个整数,指示数组中要从start开始移除的元素个数。

但是,代码将这个参数定义为最后一个要删除的数组的索引:

let j = i + 1;

解决方案是在将ij之间的差异传递给splice之前获得它:

testArray.splice(i, j - i, range);

当你这样做的时候:

testArray.splice(i, j, range);

你忘记了j是你想要擦除的数组的右极限索引,所以你需要减去i,这是左极限:

testArray.splice(i, j - i, range);

let testArray = [1, 2, 3, 6, 8, 10, 11, 12, 15, 18];
for (i = 0; i < testArray.length; i++) {
let consecutives = [];
consecutives.push(testArray[i]);
let j = i + 1;
while (j < testArray.length) {
if (testArray[j] == (testArray[j - 1] + 1)) {
consecutives.push(testArray[j]);
j++;
} else {
break;
}
}
if (consecutives.length > 2) {  // doesn´t it should be > 1 ??
let range = String(testArray[i]) + "-" + String(testArray[j - 1]);
console.log(testArray);
console.log(testArray[i]);
console.log(testArray[j]);
testArray.splice(i, j - i, range);
}
}
console.log(testArray);

相关内容

  • 没有找到相关文章

最新更新