【问题标题】:javascript function to increment arrayjavascript函数增加数组
【发布时间】:2014-02-01 11:25:35
【问题描述】:

我正在使用一个函数来根据传递给它的值递增数组中的值。

function depth(x) {
    var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    if (x < 10) {
        var deps = dep[0];
        dep[0] = deps + 1;

    } else if (x >= 10 && x < 20) {
        var deps = dep[1];
        dep[1] = deps + 1;

    } else if (x >= 20 && x < 30) {
        var deps = dep[2];
        dep[2] = deps + 1;

    } else if (x >= 30 && x < 40) {
        var deps = dep[3];
        dep[3] = deps + 1;

    } else if (x >= 40 && x < 50) {
        var dep2 = dep[4];
        dep[4] = deps + 1;

    } else if (x >= 50 && x < 60) {
        var deps = dep[5];
        dep[5] = deps + 1;

    } else if (x >= 60 && x < 70) {
        var deps = dep[6];
        dep[6] = deps + 1;

    } else if (x >= 70 && x < 80) {
        var deps = dep[7];
        dep[7] = deps + 1;

    } else if (x >= 80 && x < 90) {
        var deps = dep[8];
        dep[8] = dep2 + 1;

    } else if (x >= 90 && x < 100) {
        var deps = dep[9];
        dep[9] = dep2 + 1;

    } else if (x >= 100 && x < 110) {
        var deps = dep[10];
        dep[10] = deps + 1;


    } else if (x >= 110 && x < 120) {
        var deps = dep[11];
        dep[11] = deps + 1;

    } else if (x >= 120 && x < 130) {
        var deps = dep[12];
        dep[12] = deps + 1;

    } else if (x >= 130 && x < 140) {
        var deps = dep[13];
        dep[13] = deps + 1;

    } else if (x >= 140 && x < 150) {
        var dep2 = dep[14];
        dep[14] = deps + 1;

    } else if (x >= 150 && x < 160) {
        var deps = dep[15];
        dep[15] = deps + 1;


    } else if (x >= 160 && x < 170) {
        var deps = dep[16];
        dep[16] = deps + 1;

    } else if (x >= 170 && x < 180) {
        var deps = dep[17];
        dep[17] = deps + 1;

    } else if (x >= 180 && x < 190) {
        var deps = dep[18];
        dep[18] = dep2 + 1;

    } else if (x >= 190 && x < 200) {
        var deps = dep[19];
        dep[19] = dep2 + 1;

    } else {
        var dep2 = dep[10];
        dep[20] = dep2 + 1;

    }

}

我的问题是,有没有更简洁的方法可以做到这一点,或者我是否需要为每个可能的变量编写 else if 语句?

【问题讨论】:

  • 一个是删除所有其他的,你可以在switch中进行比较参见this answer
  • 是的...有一个模式,这是肯定的。将 x 舍入到最低 10。

标签: javascript arrays variables increment


【解决方案1】:

除了你的 else 语句之外,这里还有一个清晰的模式。因此,最简单的做法是对此有一个例外,然后将其余部分一起处理。

function depth(x) {
    var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    if (x >= 200) { // case for anything above 200
       return dep[20] = dep[10] + 1;
    }
    dep[Math.floor(x/10)]++;
}

你 else 的情况让它有点混乱,但总的来说,这是一种 1 班轮的事情。

【讨论】:

  • 这似乎已经完美解决了,i.imgur.com/4REemZM.jpg谢谢你的帮助
  • 好东西!希望它有所帮助。
  • 为什么不使用Math.max() 而不是if 语句?
  • @Jivan 如果超过 200,它不会增加 del[20],它会在 dep[10] 上加一并将其分配给 dep[20]。这就是为什么你的仍然是错误的.. 我认为这很混乱,但考虑到其中的 dep[10],很难看出它可以如何变得更好。
  • @Niall 好的,谢谢 - 在这种情况下,我真的没有看到另一种(更清洁)的方式。
【解决方案2】:

重复模式的问题

问题是您重复自己很多次,因为您的 if/else 语句中的代码有很多相似之处。

当您在代码的某些地方发现此类相似之处时,以某种方式“合并”它们通常很有用。

例如,您可能会注意到您的语句中的代码完全相同,除了 10, 20, 30 等值。然后,尝试确定一种方法使这些 10, 20, 30, 40 依赖于一个唯一变量,您将用它来替换它们。

在这种情况下,很容易猜到,因为每次你使用的数组的键等于你的数字除以 10。借助 JavaScript 的内置对象 Math 的一些方法,这是一些单行语句的问题:

function depth(x) {
    var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    var nb = Math.floor(x / 10);
    nb = Math.max(nb, 20);
    dep[nb]++;
}

关于数学函数的一些资源:

Math.max on Mozilla Developer Network

Math.floor on Mozilla Developer Network

JavaScript Math built-in object

【讨论】:

  • 是的,很容易看到一个模式,而不是将其简化为这个简短的语句,这是程序员最重要的任务之一 :-)
  • 您可以进一步简化事件 - 您可以输入 dep[nb]++ 而不是最后两行
  • 哈哈,太好了,我只是在你打字的时候这样做
  • 只是在这里记录,正如我在下面提到的,Math.max 并不能解决这个问题。目的不是在 dep[20] 超过 200 时增加它,而是将 dep[10] 加一并将其分配给 dep[20]。非常不同。
  • 你说得对 Niall。但我会照原样回答,因为我找不到比你更好的方法来解决这个问题。
【解决方案3】:

类似的东西应该可以解决问题,但是由于您的 dep 是本地的并且从未返回,因此该函数将什么也不做。

function depth(x) {
    var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    if(x < 200) {
      var index = Math.floor(x/10);
      dep[index]++;
    } else {
      dep[20] = dep[10] + 1;
    }
}

无论如何,正如您可能猜到的那样,当您看到一种模式时,您可能可以将其简化为更简单的东西。

如果您有10 的范围,这意味着您可以将数字除以10 以获得索引。您必须使用Math.floor,因为1/2 =&gt; 0.5 并且它会尝试将该值添加到不存在的索引“0.5”中。 Math.floor 会将数字截断为最小值。在我们的例子中,0,1,2,3,4...

没有全局规则,但是当您看到一个重复的模式时,您只需要找到每种情况之间的共同点,您就可以通过将值转换为可以简化大多数情况的方法对所有ifs 通用。

【讨论】:

  • 我将 dep 添加到函数中以显示我正在递增的内容, dep 数组在脚本上是全局的。
  • @那里我添加了最后一个条件
  • 感谢您的帮助 =)
【解决方案4】:

试试这个:

var index = Math.floor(x/10);
var deps = dep[index];
dep[index] = deps + 1;

【讨论】:

  • 这仅适用于 x 是 10 的倍数。查看其他答案以了解从 x 获取数组中索引的正确方法。
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 2014-03-21
  • 2011-08-23
  • 2021-07-08
  • 1970-01-01
  • 2018-10-30
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多