7

jQuery を使用して、オブジェクトを反復処理し、各値のカウントでキーの一意の値を取得するにはどうすればよいですか?

たとえば、次の配列の場合:

var electrons = [
    { name: 'Electron1', distance: 1 }, 
    { name: 'Electron2', distance: 1 }, 
    { name: 'Electron3', distance: 2 }, 
    { name: 'Electron4', distance: 2 }, 
    { name: 'Electron5', distance: 2 }, 
    { name: 'Electron6', distance: 2 }, 
    { name: 'Electron7', distance: 2 }, 
    { name: 'Electron8', distance: 2 }, 
    { name: 'Electron9', distance: 2 }, 
    { name: 'Electron10', distance: 2 }, 
    { name: 'Electron11', distance: 3 }, 
];

次のことを取り戻したいと思います。

var distance_counts = {1: 2, 2: 8, 3: 1};

私はこれを持っていますが、これは動作しますが、少し不器用です:

var radius_counts = {};
for (var i = 0; i < electrons.length; i++) { 
    if (electrons[i].distance in radius_counts) { 
         radius_counts[electrons[i].distance] += 1;
    } else { 
         radius_counts[electrons[i].distance] = 1;
    } 
}
4

1 に答える 1

8

この目的でマップを次のように使用できます。

var distances = {};
$.map(electrons,function(e,i) {
   distances[e.distance] = (distances[e.distance] || 0) + 1;
});

また

var distances = {};
$.each(electrons,function(i,e) {
   distances[this.distance] = (distances[this.distance] || 0) + 1;
});

また、このコードは見栄えがよくコンパクトですが、一般的に高速ではないことを指摘しておきます。次のように、コードをより高速で見やすくすることをお勧めします。

var distances = {},e;
for (var i = 0,l=electrons.length; i < l; i++) { 
    e = electrons[i];
    distances[e.distance] = (distances[e.distance] || 0) + 1;
}
于 2012-09-07T14:12:29.160 に答える