一天一个仿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
}
posted @ 2022-06-18 00:02  Dont  阅读(44)  评论(0编辑  收藏  举报