一天一个仿lodash函数实现-pull
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
}