有两个数组:
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
保证了每次都从末尾的元素往前推,这样就正确了。