需求说明
最近工作中遇到了一个数组去重相关的问题,大概场景是这样的
有两个数组为 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);