JS语法之:一个数组遍历操作有趣的几点

有两个数组:

let data1 = [1, 2, 3, 4, 5];
let data2 = [1, 2, 7, 8, 3, 9, 11, 4, 10, 12];

需求是,将data2中data1的元素删除,首先我这样实现:

for(let index = 0; index <data1.length; index++) {
    let d1 = data1[index];
    let index2 = data2.indexOf(d1);
    if (index2 != undefined) {
        data2.splice(index2, 1);
    }
}

执行完后,data2的结果是:

7 8 9 11 10

为什么12被删除了呢?这是因为使用indexOf时,含有某个元素会返回该元素的坐标,不含有时会返回-1,而data2.splice(-1,1)会将末尾的元素删除。

然后改为这样实现:

for (let index=0; index < data2.length; index++) {
    let d2 = data2[index];
    for (let item of data1) {
        if(d2 === item) {
            data2.splice(index, 1);
        }
    }
}

执行完后,data2的结果是:

2 7 8 9 11 10 12

为什么2没有被删除呢?这是因为data2每删除某个元素,其中元素的编号都可能改变,第一次循环删除1后,元素2的在data2中的编号变为0,而index++后从编号1开始下面的判断,2就被跳过了。

然后再改为这样实现:

for (let index=data2.length-1; index >=0; index--) {
    let d2 = data2[index];
    for (let item of data1) {
        if(d2 === item) {
            data2.splice(index, 1);
        }
    }
}

执行完后,data2的结果是:

7 8 9 11 10 12

保证了每次都从末尾的元素往前推,这样就正确了。

猜你喜欢

转载自blog.csdn.net/liminwang0311/article/details/86574475