【问题标题】:splice not removing element from array拼接不从数组中删除元素
【发布时间】:2021-09-01 04:09:59
【问题描述】:

我正在使用 splice 从数组中删除一个元素,但它不起作用。 据我所知,代码看起来不错,但也许我错过/监督了一些东西。 请看一下。这里的“状态”是一个包含对象的数组。

 let removeFromState = state;
            for(var i=0;i<removeFromState.length;i++){
                if(removeFromState[i].index===action.index){
                    removeFromState.splice[i,1];
                }
            }
            return removeFromState;

我不敢相信,我太傻了。 我已经看了很长一段时间,但没有在我面前看到它。但我很高兴我把它贴在这里,因为关于缺少条目的评论,因为即使我正在删除条目,我也在增加 'i'。

【问题讨论】:

  • 使用() 而不是[]

标签: javascript splice


【解决方案1】:

有两个问题:

  1. 一个错字,您使用的是[i,1](方括号),而您应该使用(i,1)(括号)。方括号是属性访问器。 (这不是语法错误的原因是 JavaScript 有一个 逗号运算符,而 [i,1] 的计算结果为 [1]。它不是运行时错误的原因是 functionname[1] 查找属性"1" - 然后忽略它找到的任何值。)

  2. 您的循环将跳过它删除的条目之后的条目,因为您既删除了条目并且增加了i。因此,当您删除条目 #5 时,条目 #6 将变为 #5 - 但随后您会转到 i == 6。所以你永远不会看新条目 #5。

要修复 #2,要么只增加i,如果您删除条目,或者向后循环。

所以要么:

var i = 0;
while (i < removeFromState.length) {
    if(removeFromState[i].index === action.index) {
        removeFromState.splice(i, 1);
    } else {
        ++i;
    }
}

for (var i = removeFromState.length - 1; i >= 0; --i) {
    if(removeFromState[i].index === action.index) {
        removeFromState.splice(i, 1);
    }
}

或者,创建一个 new 数组,其中只包含您要保留的条目:

var newArray = removeFromState.filter(function(entry) { return entry.index !== action.index; });

【讨论】:

  • 感谢您的回答。特别是第 2 点,因为我没有看到它的到来。是的,我可能会丢失条目。所以,做 i-- 而不是 i++ 应该可以解决这个问题吗?
  • @faraz:我在答案末尾添加了一些示例。
  • 谢谢。很有帮助
【解决方案2】:

splice 是一个方法,你用括号而不是方括号来调用它。方括号用于索引(当您“索引”该方法时,JavaScript 过于宽松并默默地返回undefined)。试试:

removeFromState.splice(i, 1);

【讨论】:

    【解决方案3】:

    错误是:您使用方括号而不是括号

    function remove(state, action) {
      let removeFromState = state;
    
      for (var i = 0; i < removeFromState.length; i++) {
        if (removeFromState[i].index === action.index) {
          removeFromState.splice(i, 1);
          i--;    // After deleting, counter reduced
        }
      }
      return removeFromState;
    }
    
    console.log(remove([{index: 3}, {index: 3}, {index: 3}], {index: 3}));

    【讨论】:

    • 既不需要while,也不需要复杂的for循环,删除的时候减少counter就好了!
    【解决方案4】:

    我被这个问题困扰了几个小时。我确实发现当你拼接一个数组时,它确实会返回从原始数组拼接的元素。

    let  originalArray = ["Apples","Oranges","Kiwi"];
    let newArray = originalArray.splice(0,1);
    console.log(newArray);
    

    我期待拼接变量中修改后的 originalArray,但它返回的是拼接的元素。 答案是

    console.log(originalArray);
    

    无论 splice 返回什么,我们可能不需要它,我们需要检查我们的 originalArray,因为它是被切片的那个。 originalArray 包含我预期的答案,即 ["Oranges","Kiwi"]

    【讨论】:

      【解决方案5】:

      问题是你如何调用splice,它是一个函数,需要像splice(i, 1)一样调用

      您可以将函数简化如下

      let removeFromState = state;
      const findEntry = entry => entry.index === action.index;
      removeFromState.splice(removeFromState.findIndex(findEntry), 1);
      return removeFromState;
      

      【讨论】:

        【解决方案6】:

        removeFromState 被实例化为 let 常量,因此不可变。如果将let removeFromState 更改为var removeFromState,它应该可以工作(。

        【讨论】:

          猜你喜欢
          • 2010-10-04
          • 2017-04-29
          • 2023-01-23
          • 1970-01-01
          • 1970-01-01
          • 2019-06-11
          • 2017-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多