2017-03-03 15 views
1
var items = [{ 
    "name": "James", 
    "gender": "boy" 
}, { 
    "name": "Sam", 
    "gender": "boy" 
}, { 
    "name": "Alice", 
    "gender": "girl" 
}]; 

我想將性別計數添加到上面的對象數組中。像男孩是2,女孩是1。我已經完成了它返回類別的部分。推送數組對象而不是其值

var genderList = []; 
for(var i = 0; i < items.length ; i++){ 
     if(genderList.indexOf(items[i].gender) < 0){ 
     genderList.push(items[i].gender); 
     } 
} 

我該如何產生這樣的結果?

[{"name":"boy","count":2},{"girl","count":1}] 
+2

由於「女孩」部分的屬性名稱沒有值(或沒有屬性名稱的值),因此所需的結果不是有效的JS。你爲什麼不使用'{「boy」:2,「girl」:1}'而不是數組? – nnnnnn

+0

我對比賽有點遲,但希望我的評論能幫助你理解發生了什麼! – Turnipdabeets

回答

1

可以使用array .reduce() method來算值 - 我建議讓輸出的結構類似{"boy": 2, "girl": 1}而不是陣列您展示的對象,因爲它創建,更新和閱讀簡單高效。

然後,您可以將它轉換爲你顯示的格式:

var items = [ 
 
    { "name": "James", "gender": "boy"}, 
 
    { "name": "Sam", "gender": "boy"}, 
 
    { "name": "Alice", "gender": "girl"} 
 
]; 
 

 
var genderCount = items.reduce(function(a, c) { 
 
    a[c.gender] = (a[c.gender]||0) + 1; 
 
    return a; 
 
}, {}); 
 
console.log(JSON.stringify(genderCount)); 
 

 
var asArray = Object.keys(genderCount).map(v => ({ name: v, count: genderCount[v] })); 
 
console.log(JSON.stringify(asArray));

如果你不熟悉.reduce(),它做同樣的事情循環之下,除了無需在當前範圍內創建額外的工作變量:

var items = [ 
 
    { "name": "James", "gender": "boy"}, 
 
    { "name": "Sam", "gender": "boy"}, 
 
    { "name": "Alice", "gender": "girl"} 
 
]; 
 

 
var genderCount = {} 
 
for (var i = 0; i < items.length; i++) { 
 
    genderCount[items[i].gender] = (genderCount[items[i].gender]||0) + 1; 
 
} 
 
console.log(JSON.stringify(genderCount)); 
 

 
// then as above to get your array of objects output: 
 
var asArray = Object.keys(genderCount).map(v => ({ name: v, count: genderCount[v] })); 
 
console.log(JSON.stringify(asArray));

注:在上面的例子中我使用JSON.stringify(),使之適合在控制檯上一條線,它不是計算/轉換過程的一部分。

+0

在'for'循環示例中,OP似乎期望得到一組對象作爲結果。 – guest271314

+0

@ guest271314 - 我最終將該部分添加到第二個塊。這種格式對我來說毫無意義,除非它可能會被輸入到某些圖形函數或類似的東西中,但它*就是她所要求的。無論哪種方式,我認爲先創建中間的'{「boy」:2,「girl」:1}'對象然後映射它,而不是在計數階段嘗試查找和更新數組中的值會更有效。 – nnnnnn

+0

reduce參數中的a和c是什麼?不可讀的兄弟。 – Mellisa

0

嘗試像this.use Array.map

var items = [{ 
 
    "name": "James", 
 
    "gender": "boy" 
 
}, { 
 
    "name": "Sam", 
 
    "gender": "boy" 
 
}, { 
 
    "name": "Alice", 
 
    "gender": "girl" 
 
}]; 
 
var b=0,g=0; 
 
items.map((item)=>(item.gender=="boy")?b++:g++); 
 
var finalArray = [{"name":"boy","count":b},{"name":"girl","count":g}] 
 
console.log(finalArray);

+0

如果你對'.map()'的返回值沒有做任何處理,你應該使用'.forEach()'。 – nnnnnn

+0

如果我有另一種性別,該怎麼辦?這種解決方案並不靈活。 – Mellisa

+0

你可以使用'if if if ..'條件來代替三元運算符來管理它。 –

1
var items = [ 
    { "name": "T", "gender": "other"}, 
    { "name": "James", "gender": "boy"}, 
    { "name": "Sam", "gender": "boy"}, 
    { "name": "Alice", "gender": "girl"} 
]; 

取前一項並比較性別類型。如果它存在,我們加1,如果沒有的話,我們創造它,並添加1

var genderTypes = items.reduce(function(prev, cur) { 
    prev[cur.gender] = (prev[cur.gender]||0) + 1; 
    return prev; 
}, {}); 

console.log('genderTypes', genderTypes) 

接下來我們把鑰匙從對象,並將其劃分爲不同的性別和計數

var separateNameAndCount = Object.keys(genderTypes).map(type => ({ name: type, count: genderTypes[type] })); 

console.log('separateNameAndCount', separateNameAndCount) 

最後我們將對象轉換爲json格式

console.log(JSON.stringify(separateNameAndCount)); 
相關問題