我目前正在研究一个数组函数,该函数将连续数字的子数组转换为表示该数字范围的字符串-例如,这个数组…
[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-1
s还没有解决这个问题。其他人在JavaScript的拼接中遇到过类似的问题吗?如果有,您是如何使其工作的?
问题在于一行代码:
testArray.splice(i, j, range);
根据MDN,第二个参数指定数组中要删除的元素个数。
deleteCount
一个整数,指示数组中要从start开始移除的元素个数。
但是,代码将这个参数定义为最后一个要删除的数组的索引:
let j = i + 1;
解决方案是在将i
和j
之间的差异传递给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);