如何不在React状态数组中包含重复值?

时间:2019-05-06 02:51:23

标签: javascript arrays reactjs

我想确保我不能将重复的值以React状态推入数组。重复的值仍然在数组中。

我尝试使用.includes,但是它不起作用。

const categoryCheck = (category) => {
  let categories = [...this.state.categories]
  if (this.state.categories === undefined) {
    return
  }
  console.log(categories, category)
  console.log(!categories.includes(category))
  if (!categories.includes(category) === false) {
    categories.push(category)
    console.log('new category', categories)
  } 
}

输入:'cat'

预期结果:['cat'] 实际结果:['cat', 'cat']

更新: 这是我的功能,这就是我的称呼方式。感谢您的所有帮助!

  uniqueCategories = category => {
    //makes sure that there are no duplicate categories in array
    if (category === undefined) {
      return;
    }
    let categories = new Set(category);
    categories = Array.from(categories);
    console.log(categories);
    return categories;
  };

我在另一个这样的函数中调用它:

  this.setState({
      categories: this.uniqueCategories([
        ...this.state.categories,
        categoryInput
      ])

3 个答案:

答案 0 :(得分:3)

 a = [1,2,4,2,3,4,1]
 s = set([1,2])
 t = list(map(lambda a: a in s, a))

是双重否定。删除>>> np.isin(a,s) array([ True, True, False, True, False, False, True])

另外,请考虑使用Set来确保唯一性( if (!categories.includes(category) === false) { 必须线性搜索数组,而在=== false中查找成员资格是一项恒定时间操作)。

这是一个使用.includes的玩具示例,您可以将其插入应用程序:

Set
Set

答案 1 :(得分:1)

您可以在ES6中使用Set

const categoryCheck = (category) => {
  if (this.state.categories === undefined) {
    return
  }
  let categories = new Set(this.state.categories)
  categories.add(category)
  this.setState({ categories: Array.from(categories) })
}

答案 2 :(得分:0)

您的逻辑相反:

if (!categories.includes(category) === false) {...}

如果该项在数组中不是,则将返回true。只需使用此:

if (!categories.includes(category)) {...}