如何使用JavaScript循环遍历不同长度的数组

How to loop through arrays of different lengths with JavaScript?

本文关键字:数组 何使用 JavaScript 循环 遍历      更新时间:2023-09-26

我的代码中的注释可以很好地解释这个问题。

// Find all commonNums divisible by arr && sequential that produce a whole number quotient.
// commonNums [ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75]
// arr [1,5]
// sequential [ 2, 3, 4 ]
for (var n = 0; n < commonNums.length; n++) {
  for (var o = 0; o < sequential.length; o++) {
    for (var p = 0; p < arr.length; p++) {
  if (commonNums[n] % arr[p] === 0 && commonNums[n] % sequential[o] === 0) {
  console.log(commonNums[n]);
}}} 
} 

由于数组的长度不同,因此简单地用一个长度为commonNums.length的循环迭代就会产生未定义的值。我的解决方案是使用3个循环,每个数组一个。

如果普通nums除以arr没有余数,并且普通nums乘以sequential没有剩余数,则返回该数字。对于arr[1,5],返回的第一个数字应该是60。

为什么这个解决方案失败了?

如果我正确理解您的问题,那么这应该会起作用。它返回60,因为这是唯一可以被其他两个数组中的每个数字整除的数字。

outerLoop:
for (var n = 0; n < commonNums.length; n++) {
    for (var o = 0; o < sequential.length; o++) {
        for (var p = 0; p < arr.length; p++) {
            if (commonNums[n] % arr[p] != 0 || commonNums[n] % sequential[o] != 0) {
                continue outerLoop;
            }
        }
    }
    console.log(commonNums[n]);
}

更新为使用lablel/continue来加快执行速度。

如果需要生成3个不同数组的所有可能的3元组,那么使用3 for循环是(唯一)的方法。(但请记住,如果你要处理大量数据,这将不会有效)

我在你的解决方案中看到的问题是,有些数字显示了两次。如果你只想把它们放在一个数组中(例如,返回它们或稍后打印它们),只需使用array.indexOf()检查它是否已经在数组中,如果不添加它。

这使用了一种更实用的方法来完成任务(返回60作为过滤数组中的第一个元素)。

function check(common, seq) {
  return common.map(function (el) {
    return seq.every(function (e) {
      return el % e === 0;
    });
  })
}

获取每组数组与commonNums的比较结果。。。

var out = check(commonNums, arr);
var out2 = check(commonNums, sequential);

然后当CCD_ 3值在每个索引中相关时过滤掉这些数字。

var out3 = commonNums.filter(function (el, i) {
  return out[i] && out2[i];
});

演示