在一次筆試題中遇到的問題,如從一個數組[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 } });
希望大家提出寶貴意見。