2012-09-07 40 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

相关问题