Javascript 推送对象数组而不是其值

Javascript 推送对象数组而不是其值,javascript,ecmascript-6,Javascript,Ecmascript 6,我想将性别计数添加到上面的对象数组中。男孩是2,女孩是1。我已经做了下面的部分,它返回的类别 var items = [{ "name": "James", "gender": "boy" }, { "name": "Sam", "gender": "boy" }, { "name": "Alice", "gender": "girl" }]; 像这样试试。使用 var项目=[{ “姓名”:“詹姆斯”, “性别”:“男孩” }, { “姓名”:

我想将性别计数添加到上面的对象数组中。男孩是2,女孩是1。我已经做了下面的部分,它返回的类别

var items = [{
    "name": "James",
    "gender": "boy"
}, {
    "name": "Sam",
    "gender": "boy"
}, {
    "name": "Alice",
    "gender": "girl"
}];
像这样试试。使用

var项目=[{
“姓名”:“詹姆斯”,
“性别”:“男孩”
}, {
“姓名”:“山姆”,
“性别”:“男孩”
}, {
“姓名”:“爱丽丝”,
“性别”:“女孩”
}];
var b=0,g=0;
items.map((item)=>(item.gender==“boy”)?b++:g++);
var finalArray=[{“name”:“boy”,“count”:b},{“name”:“girl”,“count”:g}]
控制台日志(finalArray)您可以使用来计算值-我建议使用类似于
{“boy”:2,“girl”:1}
的结构来获取输出,而不是您显示的对象数组,因为创建、更新和读取这些对象既简单又高效

然后,您可以将其转换为显示的格式:

var项目=[
{“姓名”:“詹姆斯”,“性别”:“男孩”},
{“姓名”:“萨姆”,“性别”:“男孩”},
{“姓名”:“爱丽丝”,“性别”:“女孩”}
];
var genderCount=items.reduce(函数a,c){
a[c.gender]=(a[c.gender]| | 0)+1;
返回a;
}, {});
log(JSON.stringify(genderCount));
var asArray=Object.keys(genderCount.map)(v=>({name:v,count:genderCount[v]}));
log(JSON.stringify(asArray))
取上一项并比较性别类型。如果它存在,我们添加1,如果不存在,我们创建它并添加1

var items = [
  { "name": "T", "gender": "other"},
  { "name": "James", "gender": "boy"},
  { "name": "Sam", "gender": "boy"},
  { "name": "Alice", "gender": "girl"}
];
接下来,我们从对象中取出钥匙,并将它们分成性别和计数

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

console.log('genderTypes', genderTypes)
最后,我们将对象转换为json格式

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

console.log('separateNameAndCount', separateNameAndCount)

所需结果无效,因为“girl”部分的属性名没有值(或值没有属性名)。你为什么不直接用
{“boy”:2,“girl”:1}
而不是数组呢?我玩游戏有点晚了,但希望我的评论能帮助你理解发生了什么!如果您没有对
.map()
中的返回值执行任何操作,您应该使用
.forEach()
。如果我有另一种性别怎么办?此解决方案不灵活。您可以使用
If else If.
条件而不是三元运算符来管理此操作。在
for
循环示例中,OP似乎期望得到一个对象数组。@guest271314-我最终还是将该部分添加到了第二个块中。这种格式对我来说毫无意义,除非它可能会被输入到一些绘图函数或类似的东西中,但这正是她所要求的。不管怎样,我认为先创建中间的
{“boy”:2,“girl”:1}
对象,然后对其进行映射,比在计数阶段尝试查找和更新数组中的值更有效。@Mellisa-我使用“a”表示“累加器”,使用“c”表示“当前值”。我认为它对于熟悉
.reduce()
的人来说是可读的,因为他们是标准
.reduce()
行为的一部分。如果函数长且复杂,我可能会使用
acc
val
甚至
acculator
currentVal
,但这是一个单行加返回语句,没有其他局部变量,因此。。。(根据上下文,有些人用“p”代替“a”。)
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)
console.log(JSON.stringify(separateNameAndCount));