2014-10-09 64 views
0

我有一個對象數組,我想計算不同元素的數量和這些對象的計數。從一個對象數組中計數和存儲不同的元素和它們的計數

[ { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
] 

我想統計不同名稱的數量並將它們存儲在一個對象中。我已經嘗試了1#推送數組中的所有名字, 2#然後對它們進行排序, 3#然後計算不同名稱的數量並最終將它們推送到對象。 這個過程太長。有沒有更簡單的方法來做到這一點。我使用的NodeJS

在此先感謝

回答

0

這是使用reduce function一個偉大的地方:

的減少()方法應用於對一個儲液器的功能和所述陣列的每一 值(從左到右)具有將其降低到單個值爲。

...

減少一次執行回調函數對於每個本元件中 陣列,不含所述陣列中的孔,容納四個參數: 初始值(或值從以前的回叫呼叫), 當前元素的值,當前索引以及發生迭代的陣列的值。

這將是這個樣子:

var arr = [ { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
] 

var counts = arr.reduce(function(counts, item) { 
    counts[item.name] = (counts[item.name] || 0) + 1; 
    return counts; 
}, {}); 

counts則是:

{ Suman: 2, Namus: 2 } 

要求在評論:

如果我想要的合作在對象的數組像 [{name: 'Suman', count:'2'}, {name:'Namus', count:'2'}]

UNT以及名稱。如果你已經有counts從上面的reduce電話,那麼你就可以map其按鍵到你想要的格式:

var countsArray = Object.keys(counts).map(function(name) { 
    return {name: name, count: counts[name]}; 
}); 

countsArray然後:

[ { name: 'Suman', count: 2 }, 
    { name: 'Namus', count: 2 } ] 
+0

如果我想要計數以及像 [{name:'Suman',count:2},{name:'Namus',count:2}]對象的數組中的名稱 – suman 2014-10-09 19:28:49

+0

@suman我編輯我的回答,並增加了一種方法來做到這一點。 – 2014-10-09 19:43:25

+0

謝謝隊友,我從來沒有明白過映射。你剛剛睜開眼睛。 – suman 2014-10-09 20:00:28

2

您將創建一個新的對象,其中關鍵是名稱和值計數:

var youArr = [ 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
]; 

var count = {} 
for(var i=0; i < youArr.length; i++){ 
    count[youArr[i].name] = count[youArr[i].name] || 0; 
    count[youArr[i].name]++; 
} 

alert(count['Namus']); // 2 
+1

感謝它的工作真棒。 :) – suman 2014-10-09 18:30:07

相關問題