JavaScript没有检测到数组中的indexOf -1

时间:2018-01-05 00:40:47

标签: javascript arrays algorithm indexof

我有一个简单的脚本,使得一个夹具可以匹配所有数组的所有值。

const players = ['a', 'b', 'c', 'd'];
const matches = [];

players.forEach(k => {
  players.forEach(j => {
    if(k !== j) {
      let z = [k, j]
      z.sort()
      const inArray = matches.indexOf(z) !== -1

      if(!inArray) matches.push(z)

      console.log(matches)
    }

  })
})

虽然要求Javascript搜索z是否在matches数组中,但结果有重复项并返回:

[ 'a', 'b' ]​​​​​​

​​​​​[ 'a', 'c' ]​​​​​​

​​​​​[ 'a', 'd' ]​​​​​​

​​​​​[ 'a', 'b' ]​​​​​​ --> duplicated item

​​​​​[ 'b', 'c' ]​​​​​​

​​​​​[ 'b', 'd' ]​​​​​​

​​​​​[ 'a', 'c' ]​​​​​​ --> duplicated item

​​​​​[ 'b', 'c' ]​​​​​​ --> duplicated item

​​​​​[ 'c', 'd' ]​​​​​​

​​​​​[ 'a', 'd' ]​​​​​​ --> duplicated item

​​​​​[ 'b', 'd' ]​​​​​​ --> duplicated item

​​​​​[ 'c', 'd' ]​​​​​​ --> duplicated item

如何避免这些重复的项目?

2 个答案:

答案 0 :(得分:2)

我假设你的意思是if(!inArray) matches.push(z),对吗?无论哪种方式,indexOf都不会比较数组的,而是实际检查引用等价,即数组实例本身是否相等。 / p>

为了正确比较数组的,您可能希望编写一个辅助函数而不是indexOfLuckily, this answer explains how to do just that.

Additionally, here is a great article on MDN which breaks down various kinds of equality comparisons.

答案 1 :(得分:0)

如果数组项目总是字符串,你可以做一些有点hacky的东西,但是会完成工作

const players = ['a', 'b', 'c', 'd'];
const matches = [];

players.forEach(k => {
  players.forEach(j => {
    if(k !== j) {
      let z = [k, j];

      z.sort()
      const inArray = matches.map(match=>match.join('')).indexOf(z.join('')) !== -1

      if(!inArray) matches.push(z)

      console.log(matches)
    }

  })
})

基本上你就是在比较之前将数组转换为字符串,这样可以让javascript检查它们是否相等。检查数组实例之间的相等性不起作用,并将返回不需要的结果。