在一次笔试题中遇到的问题,如从一个数组[5,1,6,8,2,4,5,10]中,删除另一个数组[5,6,2,10]中的出现的元素,且只删除从左到右第1次相同的元素,删除后的结果为[1, 8, 4, 5],从而引出下列问题。
一次删除多个相同的元素
使用 filter
var arr = [1,1,1,2,2,2,3,3]; //删除是2的元素 arr = arr.filter(item => item !== 2);
使用逆向循环,用for循环或者forEach遍历数组的话,在方法体内部splice都得不到正确的结果,解决方法是使用逆向循环
var arr = [1,2,3,1,2,3]; for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] === 2) { arr.splice(i, 1); } }
使用正则
var arr = [1, 1, 1, 2, 2, 2, 3, 3]; var a = 2; // 使用模板字符串可传入变量 var reg = new RegExp(`${a}`, "g"); arr = arr.join("").replace(reg, "").split("").map(i => Number(i))
一次删除多个不同的元素
使用 filter
var arr = [1,1,1,2,2,2,3,3];
//删除是2,3的元素
arr = arr.filter(item => [2,3].indexOf(item) == -1);
使用逆向循环
var arr = [1,2,3,1,2,3];
for (let i = arr.length - 1; i >= 0; i--) {
// 删除是2,3的元素 if ([2,3].indexOf(arr[i]) !== -1) { arr.splice(i, 1); } }
使用正则
var arr = [1, 1, 1, 2, 2, 2, 3, 3]; // 删除是2,3的元素 var a = 23; // 使用模板字符串可传入变量 var reg = new RegExp(`[${a}]`, "g"); arr = arr.join("").replace(reg, "").split("").map(i => Number(i));
回归正题
目前只想到使用filter的方法,逆向循环和正则的办法没想到,欢迎大家来补充。
var arr = [1,1,1,2,2,2,3,3]; //删除第一个是2,3的元素 var arr2 = [2, 3]; arr = arr.filter(item => { if (arr2.indexOf(item) !== -1) { arr2.shift(); return false } else { return true } });
希望大家提出宝贵意见。