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

通常の JS 配列メソッドを使用する:

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

のようにすべてを 1 つの式に圧縮できますが(k for k of items).sort((a, b) -> items[b] - items[a])[...5]、各ステップを分離した方が読みやすいと思います。

並べ替えステップでは、国コードをitemsオブジェクトの値で並べ替えます。メソッドを使用します。このArray::sortメソッドは、2 つの引数を取り、整数を返すコンパレータ関数を想定しています。Underscore.js が含まれている場合は_.sortBy、 を使用することをお勧めします。これは、引数を 1 つだけ取り、比較可能なオブジェクトを返すコンパレータ関数を使用します。

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

編集:また、代わりに(注意してください、IE <9はそれをサポートしません)または(k for k of items)を使用できます。どちらもループよりもはるかにコンパクトなJSコードにコンパイルされます。Object.keys(items)_.keys(items)

于 2013-01-15T06:19:09.657 に答える