【问题标题】:Javascript splice removes wrong elementJavascript拼接删除错误的元素
【发布时间】:2022-01-13 16:44:08
【问题描述】:

我对这个非常简单的代码无法正常工作感到有些困惑:

 //find the index to be removed
 cardData.likeData.likeUids.forEach ((entry, index) => {
    if (entry === uid){
      uidFound = true
      uidIndex = index
      console.log ("Found uid, index is " + uidIndex)
      //console shows correct index
    }
  })
  let newLikeUids = cardData.likeData.likeUids.splice (uidIndex, 1)
  //instead of deleting the found index, the element before the index is removed... for some reason

知道为什么这不起作用吗?

【问题讨论】:

  • 请在脚本中提供必要的输入,以便我们运行和重现问题。
  • 你真的应该使用 findIndex 而不是 forEach
  • 另请注意,splice 返回已删除的元素,而不是删除的结果——这是原地发生的。
  • const index = cardData.likeData.likeUids.indexOf(uid); if (index > -1) { cardData.likeData.likeUids.splice(index, 1); }
  • newLikeUids 应该是什么?我认为这是真正的问题。

标签: javascript arrays splice


【解决方案1】:

我注意到问题是您可能以错误的方式使用splice

splice() 方法通过删除或替换现有元素和/或添加新元素来更改数组的内容。要访问数组的一部分而不修改它,请参阅 slice()

但是在您的代码中,您试图将 splice 的值分配给一个不起作用的值。

您可能会混合使用slicesplice。我认为在这种情况下,您应该改用slice

slice() 方法将数组的一部分的浅拷贝返回到从开始到结束(不包括结束)选择的新数组对象中,其中开始和结束表示该数组中项目的索引。原数组不会被修改。

【讨论】:

  • 非常感谢!这正是我做错了。我已经习惯了诸如 string.replace() 之类的函数,以至于我认为我必须重新分配变量。相反, splice 会更改数组本身。非常感谢!
  • @VictoriaStudios,没问题,如果您能接受我的回答,我将不胜感激:)
【解决方案2】:

您应该使用findIndex。我不知道你的数组是什么样子,但在类似的情况下,你想从 1 和 0 的数组中删除第一个 1,你会写这样的东西:

const arr = [0,0,0,0,0,1,0,0,0];
arr.splice(arr.findIndex(e => e === 1), 1);
console.log(arr);

【讨论】:

  • indexOf 在这种情况下更好
【解决方案3】:

也许filter Array 的方法可以帮到你

cardData.likeData.likeUids.filter ((entry) => {
    return entry !== uid;
});

如果你有很多 uid 需要移除

你可以试试

cardData.likeData.likeUids.filter ((entry) => {
    return uids.indexOf(entry) === -1;
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

【讨论】:

  • 这是评论,不是答案。
  • forEach 对 return 没有任何作用......
  • @epascarello 谢谢,我复制后忘记换过滤器了。
【解决方案4】:

我根据你写的代码做了一小段代码,似乎可以做你想做的事:

更改 UID 将决定从数据中删除的内容。

let data = [1,2,3];

let uid = 1;
let foundUidIndex;

data.forEach ((entry, index) => {
    if (entry === uid){
      foundUidIndex = index;
      console.log ("Found uid, index is " + foundUidIndex)
    }
  })
 data.splice(foundUidIndex, 1);
  
console.log(data);

【讨论】:

  • 既然已经有了索引,为什么还要循环回数组呢? index 就是 foundUidIndex
  • 好点!编辑了我的答案。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2010-10-04
  • 2012-01-19
  • 2021-06-14
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多