1

次のようなRubyのハッシュ配列があります。

domains = [
 { "country" => "Germany"},
 {"country" => "United Kingdom"},
 {"country" => "Hungary"},
 {"country" => "United States"},
 {"country" => "France"},
 {"country" => "Germany"},
 {"country" => "Slovakia"},
 {"country" => "Hungary"},
 {"country" => "United States"},
 {"country" => "Norway"},
 {"country" => "Germany"},
 {"country" => "United Kingdom"},
 {"country" => "Hungary"},
 {"country" => "United States"},
 {"country" => "Norway"}
]

編集::

したがって、この形式で(CouchDBから)返される場合:

domains= {"total_rows":55717,"offset":0,"rows": [
    {"country":"Germany"},  
    {"country":"United Kingdom"},
    {"country":"Hungary"},
    {"country":"United States"},\   \ 
    {"country":"France"},
    {"country":"Germany"},
    {"country":"Slovakia"},
    {"country":"Hungary"},
    {"country":"United States"},
    {"country":"Norway"},
    {"country":"Germany"}, 
    {"country":"United Kingdom"},
    {"country":"Hungary"}, 
    {"country":"United States"},
    {"country":"Norway"}]
}

同じプロセスを適用するにはどうすればよいですか。つまり、配列内に埋め込まれたアイテムにアクセスしますか?

Rubyを使用して、配列を相互作用し、次のように重複する値を削除できます。

counted = Hash.new(0)
domains.each { |h| counted[h["country"]] += 1 }
counted = Hash[counted.map {|k,v| [k,v.to_s] }]

次のような出力は次のようになります。

{"Germany"=>"3",
 "United Kingdom"=>"2",
 "Hungary"=>"3",
 "United States"=>"3",
 "France"=>"1",
 "Slovakia"=>"1",
 "Norway"=>"2"}

私の質問は、おそらくアンダースコアのようなライブラリを使用してJavascriptを使用して同じことを達成するための最良の方法は何ですか?

よろしくお願いします、

カールスキー

4

2 に答える 2

1

値をループして、ハッシュのカウントをインクリメントするだけです。

var count = {};
domains.forEach(function (obj) { 
    var c = obj.country;
    count[c] = count[c] ? count[c] + 1 : 1;
});

(IE 8以前はサポートしていないforEachことに注意してください。気になる場合は、ポリフィルまたは通常のforループを使用してください)

于 2012-10-06T09:32:11.420 に答える
0

Rubyの場合と同じようにreduce関数を使用することもできます。

domains.reduce(function(country_with_count, country_object) {
    country_with_count[country_object['country']] = (country_with_count[country_object['country']] || 0) + 1;
    return country_with_count;
}, {});
于 2014-12-03T20:41:09.927 に答える