JavaScript没有';t在数组中检测indexOf-1

JavaScript没有';t在数组中检测indexOf-1,javascript,arrays,algorithm,indexof,Javascript,Arrays,Algorithm,Indexof,我有一个简单的脚本,它使fixture将数组的所有值与所有值进行匹配 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

我有一个简单的脚本,它使fixture将数组的所有值与所有值进行匹配

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
是否在
匹配的数组中,但结果有重复项并返回以下内容:

[ '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

如何避免这些重复项?

我想你的意思是如果(!inArray)匹配,
。按(z)
,对吗?无论哪种方式,
indexOf
都不会比较数组的,而是实际检查引用等价性,即数组实例本身是否相等

为了正确比较数组的,您可能需要编写一个helper函数来代替
indexOf


我想你的意思是如果(!inArray)匹配,
。推(z)
,对吗?无论哪种方式,
indexOf
都不会比较数组的,而是实际检查引用等价性,即数组实例本身是否相等

为了正确比较数组的,您可能需要编写一个helper函数来代替
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.map(match=>match.join('')).indexOf(z.join('')) !== -1

      if(!inArray) matches.push(z)

      console.log(matches)
    }

  })
})

基本上,在比较之前将数组转换为字符串,这为javascript提供了一种检查数组是否相等的方法。检查数组实例之间的相等性不起作用,将返回不需要的结果

如果数组项始终是字符串,您可以做一些有点粗糙的事情,但可以完成任务

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提供了一种检查数组是否相等的方法。检查数组实例之间的相等性不起作用,将返回不需要的结果

indexOf()。即:
“a”==“a”//true
,但
[]==[]//false
。试着看看为什么要调用
z.sort()
?它们不是重复的。这是因为您正在对它们进行排序(例如,您的第二个['a',b']实际上是['b',a'],那么一个解决方案如何首先不生成这些重复项呢?
players.forEach((v,i,a)=>{while(++i
Array.from(new Set(players)).forEach(…)
如果播放器本身可能包含重复项。
indexOf()
不接受数组。
indexOf
寻找相等值,因此只有原语才会真正这样工作。例如:
“a”==“a”//true
,但
[]==[]//false
。试着看看你为什么调用
z.sort()
?它们不是重复项。这是因为您正在对它们进行排序(例如,您的第二个['a',b']实际上是['b',a'],那么一个解决方案如何在一开始就不生成这些重复项呢?
players.forEach((v,i,a)=>{while(++i
数组。from(new Set(players)).forEach(…)
if播放器本身可能包含重复项。