首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript基于两个值计数相同的对象值数组

Javascript基于两个值计数相同的对象值数组
EN

Stack Overflow用户
提问于 2020-02-19 02:38:37
回答 3查看 78关注 0票数 2

假设我们有一个像这样的对象数组

代码语言:javascript
运行
复制
const studentRecord = [
 {
   name: 'John Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Steve Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Jane Doe',
   gender: 'Male',
   grade: '90'
 },{
   name: 'Mary Jane',
   gender: 'Female',
   grade: '85'
 },
]

我想把所有同年级的男生和同年级的女生一起数数,就像这样的结果……

代码语言:javascript
运行
复制
 85: {
       Male: 2,
       Female: 1,
     }
 90: {
       Female:1
     }

到目前为止,我只有这个代码

代码语言:javascript
运行
复制
    const foo = {};
    studentRecord.reduce((prevVal, currentVal) => {
      foo[currentVal['gender']] = (foo[currentVal['gender']] || 0) + 1;
    });

,它只输出{Male: 2, Female: 2}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-19 02:46:29

当还原为对象时,如果不存在,则首先在品位属性处创建一个对象。如果该级别的MaleFemale属性不存在,则创建该级别的对象,并增加该对象:

代码语言:javascript
运行
复制
const studentRecord = [
 {
   name: 'John Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Steve Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Jane Doe',
   gender: 'Male',
   grade: '90'
 },{
   name: 'Mary Jane',
   gender: 'Female',
   grade: '85'
 },
];

const results = studentRecord.reduce((a, { gender, grade }) => {
  if (!a[grade]) {
    a[grade] = {};
  }
  a[grade][gender] = (a[grade][gender] || 0) + 1;
  return a;
}, {});
console.log(results);

或者,不减

代码语言:javascript
运行
复制
const studentRecord = [
 {
   name: 'John Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Steve Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Jane Doe',
   gender: 'Male',
   grade: '90'
 },{
   name: 'Mary Jane',
   gender: 'Female',
   grade: '85'
 },
];

const results = {};
for (const { gender, grade } of studentRecord) {
  if (!results[grade]) {
    results[grade] = {};
  }
  results[grade][gender] = (results[grade][gender] || 0) + 1;
}
console.log(results);

票数 4
EN

Stack Overflow用户

发布于 2020-02-19 02:45:40

您的代码对性别键有正确的认识,但是缺少级别键,这是生成所需的嵌套对象所必需的。

下面的方法检查一个等级键是否还存在,如果它不存在,则添加它。然后,它为该键增加适当的性别。

代码语言:javascript
运行
复制
const studentRecords = [{ name: 'John Doe', gender: 'Male', grade: '85' }, { name: 'Steve Doe', gender: 'Male', grade: '85' }, { name: 'Jane Doe', gender: 'Male', grade: '90' }, { name: 'Mary Jane', gender: 'Female', grade: '85' }];

const byGrade = studentRecords.reduce((a, e) => {
  if (!(e.grade in a)) {
    a[e.grade] = {};
  }
  
  a[e.grade][e.gender] = ++a[e.grade][e.gender] || 1;
  return a;
}, {});

console.log(byGrade);

票数 1
EN

Stack Overflow用户

发布于 2020-02-19 02:51:27

尝尝这个

代码语言:javascript
运行
复制
const studentRecord = [
 {
   name: 'John Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Steve Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Jane Doe',
   gender: 'Male',
   grade: '90'
 },{
   name: 'Mary Jane',
   gender: 'Female',
   grade: '85'
 },
]

const grades = {};

studentRecord.map(e => { if(!grades[e.grade]) grades[e.grade] = {Male:0,Female:0}; });

studentRecord.map(e => grades[e.grade][e.gender]++ );

document.getElementById("result").innerHTML = JSON.stringify(grades)
代码语言:javascript
运行
复制
<div id="result"></div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60292209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档