查找对象数组中对象键VALUES的频率

时间:2017-06-05 00:56:16

标签: javascript arrays node.js

我有一系列对象(警方数据,每一个都是犯罪)。对象数组的长度为1000。

每个对象都有一个键/值,例如community_area: 22

我正在尝试迭代对象数组,以找到数组中存在的前三个社区区域。因此,如果社区22,70和1具有最多的犯罪(每个对象发生),它将返回这三个。

除了创建77个不同社区区域的数组然后比较长度之外,有什么方法可以做到这一点?

2 个答案:

答案 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]}`);
    }