2017-03-03 60 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)); 
相关问题