【发布时间】:2018-01-05 00:40:47
【问题描述】:
我有一个简单的脚本,它使一个夹具匹配一个数组的所有值。
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
如何避免这些重复项?
【问题讨论】:
-
indexOf()不带数组。 -
indexOf寻找相等性,因此只有原语才能真正像那样工作。即:"a" === "a" // true,但[] === [] // false。试试看this question -
你为什么打电话给
z.sort()? -
它们不是重复的。这是因为您正在对它们进行排序(例如,您的第二个 ['a', 'b'] 实际上是 ['b', 'a']
-
首先不生成这些重复项的解决方案怎么样?
players.forEach((v,i,a) => { while(++i < a.length) matches.push([v, a[i]]) })或Array.from(new Set(players)).forEach(...)如果玩家本身可能包含重复项。
标签: javascript arrays algorithm indexof