我有一系列对象(警方数据,每一个都是犯罪)。对象数组的长度为1000。
每个对象都有一个键/值,例如community_area: 22
。
我正在尝试迭代对象数组,以找到数组中存在的前三个社区区域。因此,如果社区22,70和1具有最多的犯罪(每个对象发生),它将返回这三个。
除了创建77个不同社区区域的数组然后比较长度之外,有什么方法可以做到这一点?
答案 0 :(得分:2)
这类事情的模式相当简单。
创建一个对象,迭代数组并使用数据对象的公共属性作为新对象中的键,值将是增量计数。
然后迭代新对象并比较这些计数
var data = [
{community_area:22},
{community_area:22},
{community_area:9},
{community_area:9},
{community_area:9},
{community_area:5},
{community_area:5},
{community_area:5},
{community_area:5},
{community_area:1},
{community_area:2},
{community_area:3},
];
var countObj = data.reduce((a,c)=>{
a[c.community_area] = (a[c.community_area] || 0 ) + 1;
return a
},{});
console.log('Community counts', countObj)
var top3 = Object.keys(countObj)
.sort((a,b) => countObj[b] - countObj[a] )
.slice(0,3)
.map(Number);//optional if need number vs string
console.log('Top 3', top3)

答案 1 :(得分:1)
我想出了这个代码 - 它有效。看起来与其他答案非常相似。
var testData = [{
area: 22
}, {
area: 23
}, {
area: 17
}, {
area: 12
}, {
area: 45
}, {
area: 12
}, {
area: 17
}, {
area: 23
}, {
area: 34
}, {
area: 22
}, {
area: 12
}, {
area: 45
}, {
area: 45
}, {
area: 45
}];
var result = testData.reduce((acc, obj) => {
if (acc.hasOwnProperty(obj.area)) {
acc[obj.area]++;
} else {
acc[obj.area] = 1;
};
return acc;
}, {});
var resultArr = [];
for ( var key in result ) { resultArr.push([key, result[key]]) }
resultArr.sort( (a, b) => b[1] - a[1] );
// now output the first 3 items
for ( var i = 0; i < resultArr.length && i < 3; i++) {
console.log( `area: ${resultArr[i][0]} = count ${resultArr[i][1]}`);
}