javascript 过滤掉数组中重复出现的值组的函数不起作用

dxxyhpgq  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(97)

我有一个包含值的数组,我试图检查下面两个值是否已经按顺序存在。
下面是代码:

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-组却有关系。我做错了什么?

f2uvfpb9

f2uvfpb91#

有一个更简单的方法来检查两个元素的序列,除非我遗漏了什么,我假设x需要是偶数索引,y是奇数索引。

function checkIfGroupExists(arr, sequence) {
  for (let i = 0; i<arr.length-1; i+=2)
    if (arr[i] === sequence[0] && arr[i+1] === sequence[1]) return true;
  return false;
}

const arr = [
  15, 
  10, 
  0,  
  0,  
  20, 
  10, 
  20, 
  15, 
  20, 
  0,  
  10, 
  15, 
  20, 
  0,   
]

console.log(checkIfGroupExists(arr, [20,15]))

注意你的函数没有通过这个测试,我不能确切地告诉你做错了什么,因为老实说,我不能真正遵循逻辑。

jw5wzhpr

jw5wzhpr2#

checkIfGroupExists函数存在一些问题,导致其行为不正确。
首先,indexOf方法将始终返回您要搜索的值的第一个匹配项,而不管它后面是否跟有序列中的下一个值。
其次,如果在数组中找到值,checkIfGroupExists函数中的while循环将始终返回true,因为它没有break语句来退出循环。
要解决这些问题,您可以修改checkIfGroupExists函数,以使用不同的方法在数组中搜索序列。以下是如何执行此操作的示例:

function checkIfGroupExists(arr, sequence) {
  // Iterate over the array and check for the sequence at each index
  for (let i = 0; i < arr.length - sequence.length + 1; i++) {
    // Check if the values at each index match the sequence
    if (arr.slice(i, i + sequence.length).every((v, j) => v === sequence[j])) {
      return true;
    }
  }
  return false;
}

checkIfGroupExists函数的此修改版本使用slice方法从arr数组中提取子数组,并使用every方法将其与sequence数组进行比较。如果每个索引处的值与sequence匹配,则函数返回true。否则,返回false。
然后,可以在fillArray函数中使用checkIfGroupExists函数的此修改版本,以正确检查items数组中重复出现的值组。

相关问题