拼接不从数组中删除元素

时间:2018-02-28 02:45:19

标签: javascript splice

我正在使用splice从数组中删除元素,但它不起作用。 据我所知,代码看起来没问题,但也许我错过了/监督某些事情。 请看一下。这里'州'是一个包含对象的数组。

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

我无法相信,我真是太傻了。 我已经看了很长一段时间,但没有在我面前看到它。但我很高兴我把它发布在这里,因为关于缺少参赛作品的评论,因为我正在增加&#39;我&#39;即使我正在删除条目。

5 个答案:

答案 0 :(得分:6)

有两个问题:

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

  2. 您的循环将在删除条目后跳过条目,因为您删除条目增加"1"。因此,当您删除条目#5时,条目#6将变为#5 - 但随后您将继续i。所以你永远不要看新的条目#5。

  3. 修复#2,如果删除条目,则只增加i == 6,或者向后循环。

    所以:

    i

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

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

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

答案 1 :(得分:2)

splice是一种方法,用括号括起来,而不是方括号。方括号用于索引(当您“索引”方法时,JavaScript只是过度放松并静默返回undefined。尝试:

removeFromState.splice(i, 1);

答案 2 :(得分:1)

  

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

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

答案 3 :(得分:1)

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

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

我期望在 spliced 变量中修改 originalArray 但它返回被拼接的元素。 答案是

console.log(originalArray);

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

答案 4 :(得分:0)

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

您可以简化以下功能

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