一天一個仿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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章