【问题标题】:Coffeescript - Iterate through object's keys/values - return sorted arrayCoffeescript - 遍历对象的键/值 - 返回排序数组
【发布时间】:2012-12-29 04:44:32
【问题描述】:

我有一个对象,其键表示国家简码,值表示计数。我想遍历这个对象并返回一组具有最高计数的国家。我是 Coffeescript 的新手,不确定最优雅的处理方式。非常感谢任何帮助。谢谢!

以下面的数据为例,我希望数组返回['AU', 'US', 'BR', 'CN', 'IN']

vacation_spots = {
  AU: 3,
  BR: 2,
  CF: 1,
  CN: 2,
  IN: 2,
  MX: 1,
  SD: 1,
  TD: 1,
  TM: 1,
  US: 3
}

get_top_5(vacation_spots)

get_top_5 = (items) ->
    for k, v of items
    # ?

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    使用原生 JS 数组方法:

    get_top_5 = (items) ->
      codes = (k for k of items)
      sortedCodes = codes.sort (a, b) -> items[b] - items[a]
      sortedCodes[...5]
    

    您可以将其全部压缩成一个表达式,例如 (k for k of items).sort((a, b) -> items[b] - items[a])[...5],但我认为将每个步骤分开读起来会更好。

    排序步骤按items 对象上的值对国家代码进行排序;它使用Array::sort 方法,该方法需要一个比较器函数,该函数接受两个参数并返回一个整数。如果您包含 Underscore.js,我建议您使用 _.sortBy,它使用只接受一个参数并返回可比较对象的比较器函数:

    sortedCodes = _.sortBy codes, (code) -> -items[code]
    

    编辑:另外,您可以使用Object.keys(items)(注意,IE _.keys(items),而不是(k for k of items),这两者都将编译为更紧凑JS代码比循环。

    【讨论】:

    • 您是说sortedCodes[...5] 吗?
    • @Kyle 是的!感谢您注意到:)
    【解决方案2】:

    试试this out

    vacation_spots =
      AU: 3
      BR: 2
      CF: 1
      CN: 2
      IN: 2
      MX: 1
      SD: 1
      TD: 1
      TM: 1
      US: 3
    
    get_top_5 = (items) ->
      ([k, v] for k, v of items).sort (a, b) ->
        b[1] - a[1]
      .slice(0, 5).map (n) -> n[0]
    
    get_top_5 vacation_spots # ["AU", "US", "BR", "CN", "IN"]
    

    【讨论】:

      【解决方案3】:
      #Use some underscore helper methods
      _ = require "underscore"
      
      vacation_spots = {
        AU: 3,
        BR: 2,
        CF: 1,
        CN: 2,
        IN: 2,
        MX: 1,
        SD: 1,
        TD: 1,
        TM: 1,
        US: 3
      }
      
      #use _.keys to get a list of country codes
      ranked = _.sortBy _.keys(vacation_spots), (spot) ->
        #Sort them by their negated counts
        -vacation_spots[spot]
      
      #Slice off the top 5
      console.log ranked.slice(0, 5)
      

      【讨论】:

        猜你喜欢
        • 2020-07-21
        • 2020-08-12
        • 2021-12-16
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 2011-10-12
        • 2021-10-05
        • 1970-01-01
        相关资源
        最近更新 更多