Coffeescript - 迭代对象的键/值 - 返回排序的数组

时间:2013-01-15 05:36:59

标签: coffeescript

我有一个对象,其中的键表示国家/地区的短代码和表示计数的值。我想迭代这个对象并返回计数最多的国家数组。我是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
    # ?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

尝试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"]

答案 2 :(得分:3)

使用vanilla JS Array方法:

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]

修改:此外,您可以使用(k for k of items)代替Object.keys(items)(请注意,IE< 9不支持它)或_.keys(items)这将编译为比循环更紧凑的JS代码。