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