1

我有一个对象,其键表示国家简码,值表示计数。我想遍历这个对象并返回一个计数最高的国家数组。我是 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
    # ?
4

3 回答 3

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)
于 2013-01-15T06:06:13.213 回答
3

试试这个

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"]
于 2013-01-15T06:07:09.403 回答
3

使用 vanilla 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]

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

于 2013-01-15T06:19:09.657 回答