【问题标题】:modulus algorithm going through an array模数算法通过数组
【发布时间】:2026-02-23 09:25:01
【问题描述】:

我希望结果是 3,1,0,0,但结果却是 3,1,1,1。下面使用模数的算法有什么问题吗?

points = [6,5,4,2];
var arr = [];
points.forEach(function (obj, i) {
    var a = 21;
    a = a % points[i] || "";

    arr.push(a);

});

console.log(arr);

http://jsfiddle.net/ufegq7kp/

【问题讨论】:

  • 为什么会期望`3,1,0,0`请解释清楚
  • 3,1,1,1 是您提供的数字的正确模数
  • 我希望因为在我得到第一个结果 3 之后,它会继续 5 % 3。

标签: javascript arrays algorithm


【解决方案1】:
In [1]: 21 % 6
Out[1]: 3

In [2]: 21 % 5
Out[2]: 1

In [3]: 21 % 4
Out[3]: 1

In [4]: 21 % 2
Out[4]: 1

您的输出是预期的输出。

不相关:您已经在forEach 函数中拥有obj 的值,而不是按索引从点查找值:

var points = [6,5,4,2],
    arr = [];

points.forEach(function (obj) {
    var a = 21;
    a = a % obj || "";
    arr.push(a);
});

console.log(arr);

【讨论】:

  • 我的想法完全正确。 JavaScript 代码没有任何问题。 @aviatewong 请查看模数运算符的工作原理。
  • 我预计 3,1,0,0 因为在我得到第一个结果 3 后,它将继续 5 % 3。如何产生该结果?
  • 你能解释一下为什么第二个操作会是 5 % 3 吗?
  • 5是第二个数组项,20% 6 = 2时使用3;
  • 你能解释一下算法吗?从您目前提供的情况来看,第三次手术仍然无法确定。
【解决方案2】:

模数返回除法的余数。

21 / 6 = 3 (remainder 3)
       21 % 6 = 3
21 / 5 = 4 (remainder 1)
       21 % 5 = 1
21 / 4 = 5 (remainder 1)
       21 % 4 = 1
21 / 2 = 10 (remainder 1)
       21 % 2 = 1

您的模数或使用它的方式没有任何问题。你期待的结果是错误的。

【讨论】:

    【解决方案3】:

    forEach 原型有两个参数元素,索引。因此,您可以在每次迭代中使用 element 值。

    查看:jsFiddle

    index - 数组中当前正在处理的元素的索引。

    element - 当前元素的实际元素值。

    points = [6,5,4,2];
    var arr = [];
    points.forEach(function (element, index) {
        var a = 21;
        a = a % element || "";
        arr.push(a);
    
    });
    
    console.log(arr);
    

    JavaScript forEach 文档

    【讨论】:

    • 请停止使用<kbd> 标签来突出显示帖子中的链接。这不是他们的目的。
    • 在我发表评论之前的 4 月 17 日,8 天,反对票已经存在。我没有给你任何反对票。