JS操作数组之Splice

3

我想要拼接我的数组,所以我创建了以下代码片段:

System.log(finalcluster.length);
for (i=0; i <= finalcluster.length; i++){
    if (finalcluster[i] != undefined ){
        System.log(finalcluster[i][0]);
        var remove = finalcluster.indexOf("dump");
        if (finalcluster[i][0] == "dump")
        {
            System.log("couse dump");
            finalcluster.splice(remove,1);
        }
        else {
            System.log("No Problem");
        }
    }
}

这段代码中有两个删除函数,我知道是因为我尝试了查找整数i的indexof函数。

当我执行这段代码时,只有两个“dump”被删除了,我认为是前面的两个,但在我的正确结果之后,还有另一个“dump”的数组。为什么split不能移动它,因为它可以从关键字之前的数组中切割。

数组:

[Name][Number]
[dump][0]
[dump][0]
[KEYWORD][KEYNUMBER]
[dump][0]
[dump][0]

那是数组模型。

拼接会直接改变数组。因此,在迭代时,当你拼接一个元素时,你的索引会跳过一个索引。尝试简单地使用 finalCluster = finalCluster.filter(cluster => cluster[0] !== "dump"); - mhodges
也许您可以展示实际数组的例子,而不是伪代码版本,因为目前并不清楚您的意思。 - Andy
这是一个创建数组的函数,在几行代码后,我将finalcluster[1][0] = "school"; finalcluster[1][1] = 1添加到其中。这就是我想要过滤的关键。finalcluster = new Array(5); for (i = 0; i < finalcluster.length; i++) { finalcluster[i] = new Array(2); finalcluster[i][0] = "dump"; finalcluster[i][1] = 0; } - muelleste
2个回答

1
你的代码存在一个问题,就是在使用 finalcluster.length 进行升序迭代 finalcluster 时,同时改变(递减)了数组的长度。因此,每次满足删除条件时,循环运行的次数会减少1,这使得数组的尾部无法访问。例如:

// seems like this would empty out the array
let arr = [1, 2, 3, 4]
for (let i = 0; i < arr.length; i++) {
   arr.splice(i, 1)
}

console.log(arr); // [2, 4]

您可以通过按照相反的顺序迭代finalcluster来避免此问题。

let arr = [1, 2, 3, 4]
for (let i = arr.length - 1; i >= 0; i--) {
   arr.splice(i, 1)
}

console.log(arr)


0

如果您不进行splice,则需要增加i,或者进行splice并减少i。目前,您正在进行splice和递增操作,这将跳过连续的dump。

为了更好地解释,您正在说dump位于索引1和2。如果您在1处进行splice,则原来在索引2处的内容现在位于索引1处,但是您让i查看索引2....

System.log(finalcluster.length);
    for (i=0; i <= finalcluster.length;){
        if (finalcluster[i] != undefined ){
            System.log(finalcluster[i][0]);
            var remove = finalcluster.indexOf("dump");

            if (finalcluster[i][0] == "dump"){
                System.log("couse dump");
                finalcluster.splice(remove,1);

            }else {
                System.log("No Problem");
                i++;
            }
        }
    }

如果不进行splice操作,上述代码将会增加i的值。否则它会保持i在当前索引位置以避免跳过索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接