splice 循环删除元素

875 阅读1分钟

先说我遇到的问题,讲解一下原因。循环删除元素的时候坐标是对不上的

    let arr = ["Banana", "Orange", "Apple", "Orange"]
    arr.splice(2,2); // 这样没有问题的

但是比如指定删除所有的 Orange 字段就需要循环删了,当我们删除第一个 Orange arr 的长度发生了变化已经找不到坐标是 3 的 Orange,所以 最后一个是删除不掉的,

按照逻辑上讲上述是没有问题的,但是我在查找原因的时候 arr 的长度发生变化之后循环就停止了。这个大家也可以试一下可以给我留言你们测试的结果。

逻辑讲清楚了就上代码了

  /**
* 判断一个值,是否是对象指定属性的值
* @ value 要对比的值
* @array 查找的数组对象
* @attr 要在 object 中和哪个属性的值做比较
*/
export const deleteObject = (value, array, attr) => {
let key = [];
let i = 0;
// 这一行可以忽略,是我做的容错处理
checkfiled (value, array);
array.forEach((item, index) => {
  if (!item[attr]) {
    throw 'attr 不存在 object 中'
  }
  if (item[attr] === value) {
    // 按照逻辑 我想在这里执行   array.splice(index - i, 1);   i++;
    // 但是 array 的 长度发生变化之后 退出循环了。只好记住坐标
    key.push(index)
  }
})
// 在这里单独 删除就可以了
key.forEach((j) => {
  array.splice(j-i, 1);
  i++;
})

}