2012-09-07 67 views
6

使用jQuery,我如何遍歷一個對象,並獲得一個密鑰的唯一值與每個值的計數?JavaScript:從一組對象中獲取唯一值和它們的計數?

例如,對於此陣:

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; 
    } 
} 
+0

試試這個http://stackoverflow.com/questions/1960473/unique-values-in-an-array –

+2

@Artem - 這是一個完全關於獲取一組唯一值的不同問題。 – Richard

+0

初始數組是否總是按原樣排序? – sp00m

回答

7

你可以使用map用於此目的爲:

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; 
} 
+0

這裏你不需要'$ .map',而是使用'$ .each'。 –

+0

@Rocket,我使用了'$ .map' coz,這是我當時想到的第一件事,雖然在這個特定的背景下,兩者都可以達到消除笨拙的目的。我也已經把相同的代碼。 –

+0

謝謝!我以前沒有見過使用'||' - 非常有用。 – Richard

相關問題