pull
從數組中剔除指定的元素,方法會改變數組
function pull(arr, ...rest){
for(let i=0;i<arr.length;i++){
if(rest.includes(arr[i])) {
arr.splice(i, 1);
i--;
}
}
return arr;
}
// 和pull的區別在於後面函數是否爲數組
function pullAll(arr, values){
for(let i=0;i<arr.length;i++){
if(values.includes(arr[i])) {
arr.splice(i, 1);
i--;
}
}
return arr;
}
function pullAllBy(arr, values, keyOrFunc){
const iteratee = typeof keyOrFunc === 'string'?(item)=>item[keyOrFunc]:keyOrFunc;
const vals = values.map(o=>iteratee(o))
for(let i=0;i<arr.length;i++){
if(vals.includes(iteratee(arr[i]))) {
arr.splice(i, 1);
i--;
}
}
return arr;
}
function pullAllWith(arr, values, comparator){
for(let i=0;i<arr.length;i++){
for(let j=0;j<values.length;j++) {
// values中存在和arr的元素匹配的情況,結束內層遍歷,刪除arr的元素,繼續遍歷其他元素
if(comparator(arr[i], values[j])) {
arr.splice(i, 1);
i--;
break;
}
}
}
return arr;
}
function pullAt(arr, indexes){
const removes = [];
// index退位,表示前面已經刪了多少個元素
let delta = 0;
// 保險起見,先把indexes按升序排列
const delIndexes = indexes.sort((a,b)=>a-b);
for(let i=0;i<delIndexes.length;i++){
// 目標索引需要算上前面已經刪除的個數,索引會變化
const targetIndex = delIndexes[i] + delta;
removes.push(arr[targetIndex]);
arr.splice(targetIndex,1);
// 關鍵步驟,表示已經刪除了幾個
delta--;
}
return removes
}