【问题标题】:React - Check if a value already exists in an array?React - 检查数组中是否已经存在一个值?
【发布时间】:2019-08-22 15:04:50
【问题描述】:

我正在制作一个简单的 React 购物清单,您可以在其中添加/删除列表中的项目 (pen here)。到目前为止它工作得很好,除非你在列表中添加一个重复的条目并尝试删除它,它会变得混乱(它使用值作为键,所以大概这就是原因)。为了解决这个问题,我想在添加项目时检查该值是否已存在于列表数组中,并阻止它被添加。我尝试通过将 if (this.state.newItem.length > 0){ 更改为 if (this.state.newItem.length > 0 && this.state.items.includes(this.state.newItem) == false){ (第 18 行)在 handleAddNew 函数中添加另一个检查,但这似乎不起作用。关于我应该如何做这件事的任何想法?

【问题讨论】:

  • 请在此处发布您的代码,而不是在外部链接后面。
  • 尝试使用 some() ,它会起作用 array.some(function(o){return o["key1"] === "value2";}) 如果找到对,则为真,否则为假。
  • if (this.state.newItem.length && !this.state.items.includes(this.state.newItem))你可以用这个
  • 感谢@NarendraChouhan,这也与下面的 Matt Way 的回答一样有效。我更喜欢这个答案,因为当您单击“添加项目”时它不会删除文本输入条目。
  • 我很高兴@Godge 你能把答案标记为正确吗,如果你觉得我的答案对你有用,我已经在下面发布了代码

标签: javascript arrays reactjs list arraylist


【解决方案1】:

问题是输入表单无权访问列表进行任何比较。您可以通过将addItem 函数更改为:

addItem(item) {
  // only add if the item doesn't exist in the list
  if(this.state.items.indexOf(item) < 0){
    this.setState((state) => ({
      items: state.items.concat([item])
    }))
  }
}

请注意,我在这里使用indexOf,但includes 也可以。您可以随意进行比较。

【讨论】:

  • 感谢@MattWay,这成功了!我必须承认,我更喜欢 @NarendraChouhan 的回答,因为它不会触发 this.setState({ newItem: '' }) 代码,从输入中删除文本,但除此之外它也能正常工作。
  • 编辑:忽略我之前的评论,在我测试了一下之后,我意识到@NarendraChouhan's 阻止如果原始重复值已被删除,则阻止添加该项目,所以你的答案似乎是解决方案。再次感谢!
  • 您可以在过滤器中添加一些区分大小写的功能,请检查此笔:codepen.io/anon/pen/mgyEew
  • 感谢@AbdelkarimELAMEL,这是一个很好的解决方案。我还在检查中添加了一个修剪,以便它检查不包括前导/尾随空格的重复项,效果很好。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多