2017-06-29 44 views
0

我需要計算javascript中jsonArray項中值的出現次數。 認爲這是我的jsonArray在jsonArray項中重複的javascript計數值

{"name":"jack","age":23}, 
{"name":"john","age":20}, 
{"name":"alison","age":23}, 
{"name":"steve","age":25}, 
. 
. 
. 

現在比如我需要知道每個年齡有多少次這樣的陣列中的重複,我想計算每個屬性的每個值,我的意思是,我需要這樣的結果:

name : {"jack" : 2,"james" : 10,"john" : 1,....} 

age : {"23":10,"20":15,"25":2,....} 

實現此目的的最簡單方法是什麼?

編輯: 我的數組非常大,我不想爲每個值調用count函數。我想要一個代碼來計算每個值的重複次數。

+0

[計數對象值的出現次數](https://stackoverflow.com/questions/29957390/counting-occurrences-of-object-values) – mhodges

回答

1

你可以看看Array.prototype.reduce

function mapToProp(data, prop) { 
 
    return data 
 
    .reduce((res, item) => Object 
 
     .assign(res, { 
 
     [item[prop]]: 1 + (res[item[prop]] || 0) 
 
     }), Object.create(null)) 
 
    ; 
 
} 
 

 

 
const data = [ 
 
    {"name": "jack", "age": 23}, 
 
    {"name": "john", "age": 20}, 
 
    {"name": "alison", "age": 23}, 
 
    {"name": "steve", "age": 25} 
 
]; 
 

 
console.log('mapAndCountByAge', mapToProp(data, 'age'))

+0

「我想計算每個屬性的每個值」 – mhodges

+0

this是非常好的,但是如果不知道值的話,那麼大陣列呢? 是否可以在不知道它的情況下對每個值進行計數?只需計算屬性中每個值的出現次數 – m7majidi

+0

@ m7majidi是的,那確切的問題是爲什麼我將其標記爲重複項。查看我在評論中鏈接的問題。這個問題已被多次詢問,並且是一個簡單的谷歌搜索問題。 – mhodges

0

你可以使用一個對象,其中鍵和值用作屬性計數。

var array = [{ name: "jack", age:23 }, { 'name': "john", age: 20 }, { name: "alison", age: 23 }, { name: "steve", age: 25 }], 
 
    result = {}; 
 

 
array.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     result[k] = result[k] || {}; 
 
     result[k][o[k]] = (result[k][o[k]] || 0) + 1; 
 
    }); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

不優雅的Nina'sHitmands'答案,但是這是比較容易理解,適合初學者(如果任何初學者閱讀本)。

var jsonArray = [ 
 
    {"name": "John", "age": 20}, 
 
    {"name": "John", "age": 21}, 
 
    {"name": "Doe", "age": 21}, 
 
    {"name": "Doe", "age": 23}, 
 
    {"name": "Doe", "age": 20}, 
 
]; 
 
var names = [], 
 
    ages = []; 
 

 
// separate name data and age data into respective array 
 
// only need to access the original data once 
 
jsonArray.forEach(function(val){ 
 
    names.push(val['name']); 
 
    ages.push(val['age']); 
 
}); 
 

 
function aggregate(array){ 
 
    var obj = {}; 
 

 
    array.forEach(function(val){ 
 
     if (!obj[val]) 
 
      // create new property if property is not found 
 
      obj[val] = 1; 
 
     else 
 
      // increment matched property by 1 
 
      obj[val]++; 
 
    }); 
 
    
 
    return JSON.stringify(obj); 
 
} 
 

 
console.log("Names: " + aggregate(names)); 
 
console.log("Ages: " + aggregate(ages));

In my opinion,龔如心在這裏有最好的答案。

編輯

事實上,當有大的數據集(如OP指出,「陣非常大」)提出,這種方法比尼娜的回答比Hitmand的快了約45%,約81%的速度根據jsben.ch回答。我不知道爲什麼。