【问题标题】:How to loop through arrays of different lengths with JavaScript?如何使用 JavaScript 遍历不同长度的数组?
【发布时间】:2016-03-29 20:45:32
【问题描述】:

我的代码中的 cmets 最好地解释了这个问题。

// 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 个循环,每个数组一个。

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

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

【问题讨论】:

  • 您看到了什么错误?
  • 返回的第一个数字不应该是10吗?毕竟10 % 1 == 010 % 2 == 0
  • 我没有收到错误,但我确实得到了 10 作为熵建议的第一个数字。 10, 10, 15, 15, 20, 20, 20, 20, 30, 30, 30, 30, 40, 40, 40, 40, 45, 45, 50, 50, 60,60,60,60,60, 60、70、70、75、75。
  • 根据您的第一条评论,您应该在 commonNums 中找到所有可以被 arr && 连续整除的数字。这是否意味着只有当它可以被 arr 和顺序中的所有数字整除时才应该打印数字?
  • 代码完全按照它的编写方式运行,没有问题。如果您的输出不正确,则说明您没有正确定义问题。

标签: javascript arrays


【解决方案1】:

如果我正确理解了您的问题,那么这应该可以。它返回 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]);
}

更新为使用标签/继续加快执行速度。

【讨论】:

  • 感谢他弄清楚了他想要什么 - 但你可以通过添加一次 break 语句来真正加快执行速度 match == false
  • 你能解释一下熵吗?
  • 他的意思是,在代码发现 arr 或 sequence 中的一个数字不起作用之后,我的旧代码将继续检查所有剩余的数字,即使它是不必要的。新代码只是跳转到 commonNums 中的下一个数字。
【解决方案2】:

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

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

【讨论】:

  • 由于Array.indexOf() 的复杂性为O(n),在最坏的情况下,它会是O(m * n * p) 的时间和空间,因此对于大型数据集可能会非常昂贵,我建议写一个散列使​​其变为O(1)(但在空间上仍然具有相同的复杂性)。
  • 是的,确实如此。使用对象会是更好的选择,例如:pastebin.com/3bpzQm5t
【解决方案3】:

使用更实用的方法来解决问题(返回 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);

...然后过滤掉每个索引中true 值相关时的数字。

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

DEMO

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2016-04-25
    • 2016-02-23
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多