私は状態の配列を持っています:
['CO','CA','CO','AL', ... ,'NV']
そして、私は次のように減らしたいと思います:
{ 'CO': 9, 'CA':17, 'AL':1, etc}
値は、配列内で各状態が発生する回数です。
これを行う最も効率的な方法は何ですか?
私は状態の配列を持っています:
['CO','CA','CO','AL', ... ,'NV']
そして、私は次のように減らしたいと思います:
{ 'CO': 9, 'CA':17, 'AL':1, etc}
値は、配列内で各状態が発生する回数です。
これを行う最も効率的な方法は何ですか?
function compress2dict( raw_arr )
{
var ret={};
for(var i=0;i<raw_arr.length;i++)
{
var item=raw_arr[i];
ret[item]|=0;
ret[item]++;
}
return ret;
}
a = ['CO','BO','CO','CC','CC','CO','CC']
b = compress2dict(a)
b
{'BO':1, 'CC':3, 'CO':3}
array_count_values
PHPJSに興味があるかもしれません。PHParray_count_values
関数は目的どおりに動作するため、その関数の JavaScript ポートが適合するのは当然のことです。
配列を反復処理し、メンバー値をオブジェクト プロパティ名に割り当て、出現回数を値として割り当てるだけだと思います。
function toObj(arr) {
var item, obj = {};
for (var i=0, iLen=arr.length; i<iLen; i++) {
item = arr[i];
obj[item]? ++obj[item] : (obj[item] = 1);
}
return obj;
}
または、while ループが好きな場合 (高速な場合もあれば、そうでない場合もあります):
function toObj(arr) {
var item, obj = {}, i = arr.length;
while (i) {
item = arr[--i];
obj[item]? ++obj[item] : (obj[item] = 1);
}
return obj;
}