我有一个简单的脚本,使得一个夹具可以匹配所有数组的所有值。
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
如何避免这些重复的项目?
答案 0 :(得分:2)
我假设你的意思是if(!inArray) matches.push(z)
,对吗?无论哪种方式,indexOf
都不会比较数组的值,而是实际检查引用等价,即数组实例本身是否相等。 / p>
为了正确比较数组的值,您可能希望编写一个辅助函数而不是indexOf
。 Luckily, this answer explains how to do just that.
答案 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检查它们是否相等。检查数组实例之间的相等性不起作用,并将返回不需要的结果。