【JavaScript】数组坍塌原理之逆战班系列

136 阅读1分钟

数组坍塌:

在对数组进行操作的时候,可能会使数组的长度发生改变,同时操作的数组那个项的下一个索引下标会被跳过,从而造成数组中的某项会被跳过,这样的现象就叫做数组的坍塌现象。 例如: 循环判断数组中的每一项,如果有重复值就删除。

var arr = [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9];
		// 遍历
		for (var i = 0; i < arr.length; i++) {
			// 判断
            for(var j=i+1;j<arr.length;j++)
			if (arr[i] === arr[j]) {
				arr.splice(j, 1); 
			}
		}
		console.log(arr);

循环到第一个重复值1,其索引下标为1,将其删除,此时数组长度从原来的11变为10,索引值还是为1,接着执行i++,此时索引值为2,但数组中原本索引下标为2的值,此时索引下标已经为1,从而造成了输出结果会有两个1,就形成了数组坍塌现象。

解决办法:

在对数组某项操作之后,手动将索引值-1,保持每一项都被遍历

var arr = [1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9];
        // 遍历
        for (var i = 0; i < arr.length; i++) {
            // 判断
            for(var j=i+1;j<arr.length;j++)
            if (arr[i] === arr[j]) {
                arr.splice(j, 1); 
                i--;  // 将索引值-1,保持每项都被遍历
            }
        }
        console.log(arr);