我的代码中的注释最能解释问题。
// 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个循环,每个数组一个。
如果常用num除以arr没有余数,并且如果常用nums除以sequential没有余数,则返回该数字。对于arr [1,5],返回的第一个数字应为60.
为什么这个解决方案失败了?
答案 0 :(得分:2)
如果我理解你的问题,那么这应该有效。它返回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加速执行。
答案 1 :(得分:0)
如果需要生成3个不同数组的所有可能的3元组,则使用3 for循环是(唯一的)方法。 (但请记住,如果处理大量数据,这将无效)
我在您的解决方案中看到的问题是某些数字会显示两次。如果您只想将它们放在一个数组中(例如,为了返回它们或稍后打印它们),只需使用Array.indexOf()检查它是否已经在数组中,如果没有添加它。
答案 2 :(得分:0)
使用功能更强大的方法来解决这个问题(使用过滤数组中的第一个元素返回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];
});