拼接不从数组中删除元素

splice not removing element from array

我正在使用 splice 从数组中删除一个元素,但它不起作用。 据我所知,代码看起来不错,但也许我 missing/overseeing 有点。 请看一下。这里 'state' 是一个包含对象的数组。

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

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

splice是一个方法,你用括号调用它,而不是方括号。方括号用于索引(JavaScript 只是在您 "index" 方法时过度放松并默默地 returns undefined )。尝试:

removeFromState.splice(i, 1);

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

那样调用

您可以将函数简化如下

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

有两个问题:

  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; });

Mistake was: you used square brackets instead of parenthesis

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}));

我在这个问题上停留了几个小时。我确实发现当你拼接一个数组时,它会 returns 从原始数组拼接的元素。

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

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

console.log(originalArray);

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

removeFromState 被实例化为 let 常量,因此不可变。如果 let removeFromState 更改为 var removeFromState (.