首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coffeescript -增加分组的改进算法

Coffeescript -增加分组的改进算法
EN

Stack Overflow用户
提问于 2012-10-28 05:11:54
回答 1查看 68关注 0票数 2

下面的代码可以工作,但我想知道是否有更好的方式,也许使用一些我不熟悉的coffeescript的功能。

问题是,我需要对项目进行分页,但分页次数每次都会增加。

如果我以数字20为例,它将创建以下页面:

1-3 4-7 8- 15 16 - 20

我有以下测试和代码可以通过:

代码语言:javascript
复制
module 'Remainder',
  setup: ->
    @remainder = 20

test 'splits remainder incrementally', ->
  parts = @remainder.increasingSplit()
  equal parts[0], '1 - 3', ''
  equal parts[1], '4 - 7', ''
  equal parts[2], '8 - 15', ''
  equal parts[3], '16 - 20', ''

Number.prototype.increasingSplit = ->
  start = 1
  nextSplit = 3
  parts = []
  finished = false
  while !finished
    if nextSplit > @
      parts.push "#{start} - #{@}"
      break

    parts.push "#{start} - #{nextSplit}"
    start = nextSplit + 1
    nextSplit = nextSplit * 2 + 1

  parts
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-28 07:42:11

在不过多更改算法的情况下,您可以尝试这样做:

代码语言:javascript
复制
Number::increasingSplit = ->
  start = 1
  nextSplit = 3
  parts = []
  while start <= @
    parts.push "#{start} - #{Math.min nextSplit, @}"
    start = nextSplit + 1
    nextSplit = nextSplit * 2 + 1
  parts

这些变化是:

  • .prototype替换为::
  • 删除finished变量(因为break无论如何都没有得到有效使用)和break,并将条件更改为仅使用一个D13、

  • ,其中D14和D15之间的最小值作为顶部。

另外,我建议不要在这种情况下扩展Number原型。扩展原语类型的原型有时会导致奇怪的问题,例如:

代码语言:javascript
复制
Number::isFour = -> @ is 4
console.log 4.isFour() # -> false

这是因为在函数@内部将是一个Number对象,而不是一个原始number,从而使=== 4比较总是失败。如果将isFour定义为独立函数,则不会发生这种情况:

代码语言:javascript
复制
isFour = (n) -> n is 4
console.log isFour 4 # -> true

所以,我更喜欢这个版本的incrasingSplit

代码语言:javascript
复制
increasingSplit = (n) ->
  start = 1
  nextSplit = 3
  parts = []
  while start <= n
    parts.push "#{start} - #{Math.min nextSplit, n}"
    start = nextSplit + 1
    nextSplit = nextSplit * 2 + 1
  parts

最后,如果您不介意递归,您可以使用更具FP风格的算法:)

代码语言:javascript
复制
increasingSplit = (n, start = 1, nextSplit = 3) ->
  if start > n
    []
  else
    part = "#{start} - #{Math.min nextSplit, n}"
    rest = increasingSplit n, nextSplit + 1, nextSplit * 2 + 1
    [part, rest...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13104221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档