两个数组条件去重


需求说明


最近工作中遇到了一个数组去重相关的问题,大概场景是这样的


有两个数组为 arrOen为oldlList:[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]中随机项,arrTwo为oldlList中随机项加’_’再加随机数字
例如

list:['1', '2', '3', '4', '5']
arrOen:['1','3']
arrTwo:['5_2323','3_98','1_234','2_123','1_23','3_123','4_12','4_124']

需求为将arrTwo中的每一项的第一个字符不存在于arrOne的元素从arrTwo中删除
例如上例结果为

arrTwo:['1_234','1_23','3_123']

功能实现


第一步,将arrOne同目标list进行对比取反,即得到newArrOne:[‘2’,’4’,’5’]

第二步,对得到的newArrOne进行遍历,内部则对arrTwo进行while循环处理,找出arrTwo中的第一个字符存在于arrOne的元素,将此元素删除


代码展示


let list = ["1", "2", "3", "4", "5"];
let arrOen = ["1", "3"];
let arrTwo = ['5_2323','3_98','1_234','2_123','1_23','3_123','4_12','4_124']
let newArrOne = [];
list.forEach((a) => {
  let c = arrOen.findIndex((b) => a === b);
  if (c > -1) delete arrOen[c];
  else newArrOne.push(a);
});
newArrOne.forEach((item) => {
  let i = arrTwo.length;
  while (i--) {
    const ele = arrTwo[i];
    if (item === ele.slice(0, 1)) {
      let index = arrTwo.indexOf(ele);
      arrTwo.splice(index, 1);
    }
  }
});
console.log(arrTwo);

代码分析


findIndex()方法

定义和用法
findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。

findIndex() 方法为数组中的每个元素都调用一次函数执行:

当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。
如果没有符合条件的元素返回 -1
注意: findIndex() 对于空数组,函数是不会执行的。

注意: findIndex() 并没有改变数组的原始值。
获取数组中年龄大于等于 18 的第一个元素索引位置
var ages = [3, 10, 18, 20];
 
function checkAdult(age) {
    return age >= 18;
}
 
function myFunction() {
    document.getElementById("demo").innerHTML = ages.findIndex(checkAdult);
}
fruits 输出结果:
2
因此我们利用findIndex()来对arrOne取反
list.forEach((a) => {
  let c = arrOen.findIndex((b) => a === b);
  if (c > -1) delete arrOen[c];
  else newArrOne.push(a);
});

while循环

利用while循环主要解决JS遍历数组,删除数组元素时,怎么删都会漏掉一个的问题
例如
var arr = [1, 2, 2, 3, 4, 5];
    var i = arr.length;
    while(i--) {
        console.log(i + ' = ' + arr[i]);
        if(arr[i] === 2) {
            arr.splice(i, 1);
        }
     }
    console.log(arr);

因此,在最后的循环去重的内部循环操作中选择了while循环
newArrOne.forEach((item) => {
  let i = arrTwo.length;
  while (i--) {
    const ele = arrTwo[i];
    if (item === ele.slice(0, 1)) {
      let index = arrTwo.indexOf(ele);
      arrTwo.splice(index, 1);
    }
  }
});
其他解决方法
方法1:实时调整数组中元素的下标对应关系
var arr = [1, 2, 2, 3, 4, 5];
    for (var i = 0; i < arr.length; i++){
        // 打印数组中的情况,便于跟踪数组中数据的变化
        console.log(i + ' = ' + arr[i]);
        // 删除掉所有为2的元素
        if(arr[i] === 2) {
            arr.splice(i--, 1);
        }
    }
    console.log(arr);
方法2:从后往前遍历数组元素
var arr = [1, 2, 2, 3, 4, 5];
    for (var i = arr.length - 1; i >= 0; i--) {
        // 打印数组中的情况,便于跟踪数组中数据的变化
        console.log(i + ' = ' + arr[i]);
        // 删除掉所有为2的元素
        if(arr[i] === 2) {
            arr.splice(i, 1);
        }
    }
    console.log(arr);


文章作者: liwenka1
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liwenka1 !
  目录