我有一个包含值的数组,我试图检查下面两个值是否已经按顺序存在。
下面是代码:
let items = [];
let x = 0;
let y = 0;
let xc = [0, 10, 15, 20];
let yc = [0, 10, 15, 20];
function fillArray() {
for (let i = 0; i < 10; i++) {
x = xc[Math.floor(Math.random() * xc.length)];
y = yc[Math.floor(Math.random() * yc.length)];
while (checkIfGroupExists(items, [x, y])) {
console.log(`sequence ${x},${y} already exists.`);
x = xc[Math.floor(Math.random() * xc.length)];
y = yc[Math.floor(Math.random() * yc.length)];
}
items.push(x, y);
}
}
function checkIfGroupExists(arr, sequence) {
if (arr.length === 0) {
return false;
}
const first = sequence[0];
let index = arr.indexOf(first, 0);
while (index > -1) {
if (sequence.every((v, i) => arr[index + i] === v)) {
return true;
}
index = arr.indexOf(first, index);
if (index == -1) {
return false;
}
index++;
}
return false;
}
console.log(items);
现在我得到了消息“Sequence x,y already exists.”看起来无论何时记录该消息,序列都不会被推送。但是,在一些循环中,数组中找不到组,已经存在的序列被推送。
结果示例:
[
15, //(x)
10, //(y)
0, //(x)
0, //(y)
20, //(x)
10, //(y)
20, //(x) <--
15, //(y) <--
20, //(x)
0, //(y)
10, //(x)
15, //(y)
20, //(x)
0, //(y)
0, //(x)
15, //(y)
20, //(x) <--
15, //(y) <--
20, //(x)
20 //(y)
]
这里20,15被两次推入数组。重复出现的0,0并不重要,因为它们不会在同一个“组”中重复出现,例如x=0后跟着y=0,但20,15-组却有关系。我做错了什么?
2条答案
按热度按时间f2uvfpb91#
有一个更简单的方法来检查两个元素的序列,除非我遗漏了什么,我假设x需要是偶数索引,y是奇数索引。
注意你的函数没有通过这个测试,我不能确切地告诉你做错了什么,因为老实说,我不能真正遵循逻辑。
jw5wzhpr2#
checkIfGroupExists函数存在一些问题,导致其行为不正确。
首先,indexOf方法将始终返回您要搜索的值的第一个匹配项,而不管它后面是否跟有序列中的下一个值。
其次,如果在数组中找到值,checkIfGroupExists函数中的while循环将始终返回true,因为它没有break语句来退出循环。
要解决这些问题,您可以修改checkIfGroupExists函数,以使用不同的方法在数组中搜索序列。以下是如何执行此操作的示例:
checkIfGroupExists函数的此修改版本使用slice方法从arr数组中提取子数组,并使用every方法将其与sequence数组进行比较。如果每个索引处的值与sequence匹配,则函数返回true。否则,返回false。
然后,可以在fillArray函数中使用checkIfGroupExists函数的此修改版本,以正确检查items数组中重复出现的值组。