Javascript 未从阵列中删除元素的拼接

Javascript 未从阵列中删除元素的拼接,javascript,splice,Javascript,Splice,我正在使用splice从阵列中删除一个元素,但它不起作用。 据我所知,代码看起来不错,但可能我遗漏了/监督了一些东西。 请看一看。这里的“state”是一个包含对象的数组 let removeFromState = state; for(var i=0;i<removeFromState.length;i++){ if(removeFromState[i].index===action.index){

我正在使用splice从阵列中删除一个元素,但它不起作用。 据我所知,代码看起来不错,但可能我遗漏了/监督了一些东西。 请看一看。这里的“state”是一个包含对象的数组

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

对于(var i=0;i
splice
是一个方法,您可以用括号而不是方括号来调用它。方括号用于索引(JavaScript只是过于宽松,当您“索引”该方法时,会无声地返回
未定义的
)。尝试:


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

您可以将函数简化如下

let removeFromState = state;
const findEntry = entry => entry.index === action.index;
removeFromState.splice(removeFromState.findIndex(findEntry), 1);
return removeFromState;
有两个问题:

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

  • 循环将在删除条目后跳过条目,因为您同时删除了条目并增加了
    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;
        }
    }
    
    或者,创建一个仅包含要保留的项的新数组:

    var newArray = removeFromState.filter(function(entry) { return entry.index !== action.index; });
    
    错误是:您使用了方括号而不是括号

    功能删除(状态、操作){
    让removeFromState=状态;
    for(var i=0;ilog(remove([{index:3},{index:3},{index:3}],{index:3}));
    我在这个问题上纠缠了几个小时。我确实发现,当拼接数组时,它会返回从原始数组拼接的元素

    let  originalArray = ["Apples","Oranges","Kiwi"];
    let newArray = originalArray.splice(0,1);
    console.log(newArray);
    
    我希望在拼接变量中使用修改后的originalArray,但它返回拼接的元素。 答案是

    console.log(originalArray);
    
    无论拼接返回什么,我们可能不需要它,我们需要检查原始阵列,因为它是被切片的。
    原始数组由我预期的答案组成,即[“橙子”、“猕猴桃”]

    使用
    ()
    而不是
    []
    谢谢你的回答。特别是第2点,因为我没有看到它的到来。是的,我可能会丢失条目。所以,用I--而不是I++应该解决这个问题吗?@faraz:我在答案的末尾添加了一些示例。谢谢。非常有用。你不需要while,也不需要复杂的for循环,只要在删除时减少计数器就行了!
    let  originalArray = ["Apples","Oranges","Kiwi"];
    let newArray = originalArray.splice(0,1);
    console.log(newArray);
    
    console.log(originalArray);