【问题标题】:Refactoring a while loop in javascript using .map or underscore.js使用 .map 或 underscore.js 在 javascript 中重构 while 循环
【发布时间】:2015-08-21 00:46:20
【问题描述】:

好的,所以我的代码中有这个非常糟糕的 while 循环。我正在尝试重构它以使用 Underscore.js 或 js 中的 .map 函数,但我一直卡住。这是我所拥有的工作代码:

createGroupedChannels = (array) ->
        groups = []
        i = 0
        column = 0
        while i < array.length
          if groups.length <= 2
            groups.push [array[i]]
            i += 1
          else
            groups[column].push array[i]
            column += 1
            i += 1
            if column is 3
              column = 0
        groups.reverse()

重点是将数组分成3组,保持初始的相对顺序。我尝试了几种尝试使用下划线的配置均无济于事。我对 JS 相当陌生,非常感谢任何帮助。

我目前使用 .map 的内容根本不起作用,但我正在根据请求添加它:

createGroupedChannels = (array) ->
        _.map array, () ->
          i = 0
          column = 0
          groups = []
          if groups.length <= 2
            groups.push [array[i]]

          else
            groups[column].push array[i]
          i += 1
          column += 1
          column = 0 if column is 3
          groups.reverse()

【问题讨论】:

  • 你能告诉我们你用.map尝试的代码吗?
  • 尽管有点尴尬,但我编辑展示了我尝试过的内容
  • 这条线看起来很可疑:column = 0 if column is 3。您也可以使用column = column + 1 % 3 并避免使用if
  • 应该提到这是咖啡脚本,所以我认为这是有效的语法。
  • 我也很怀疑。对我来说看起来不错。也许您可以从输出中收集错误所在的位置?

标签: javascript jquery coffeescript underscore.js


【解决方案1】:

没有Array.prototype.map,但有Array.prototype.reduce

var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    groups = data.reduce(function (r, a, i) {
        r[i % 3].push(a);
        return r;
    }, [[],[],[]]);

document.write('<pre>' + JSON.stringify(groups, 0, 4) + '</pre>');

【讨论】:

  • 你能向我解释一下最后一部分(“, [[],[],[]])"),因为我的搜索没有出现吗?
  • 这是一个空数组,用于reduce的返回值。排好序的列需要三个空数组。
  • 我明白这一点,但我不熟悉这种语法,在上面找不到任何文档。再次感谢您的帮助。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2018-03-30
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多