首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从对象数组中获取学生的出现情况

从对象数组中获取学生的出现情况
EN

Stack Overflow用户
提问于 2022-04-20 23:08:55
回答 5查看 64关注 0票数 0

我有一群学生:

代码语言:javascript
运行
复制
var studentsArray = [{
    "studentId": "1",
    "courses": ["A", "A", "B", "D", "A"],
    "classPeriods": ["Chemistry", "Chemistry", "Maths"]
  },
  {
    "studentId": "1",
    "courses": ["E", "F", "E"],
    "classPeriods": ["Biology", "Chemistry", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["A", "D", "D"],
    "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["G", "K"],
    "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"]
  },
  {
    "studentId": "1",
    "courses": ["A", "B", "D"],
    "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"]
  },
  {
    "studentId": "2",
    "courses": ["A", "C", "F"],
    "classPeriods": ["Arts", "Maths", "Arts", "Maths"]
  },
  {
    "studentId": "2",
    "courses": ["B", "B", "D"],
    "classPeriods": ["Arts", "Arts", "Maths", "Maths"]
  },
  {
    "studentId": "3",
    "courses": ["H", "B", "R"],
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  }
]

在这里,我需要学生的总事件与他们的课程classPeriods合并。

例如:

Student 2的一个对象应该是:

代码语言:javascript
运行
复制
{
    "studentId": "2",
    "occurrence": 2,
    "courses": ["A", "C", "F", "B", "B", "D"],
    "classPeriods": ["Arts", "Maths", "Arts", "Chemistry", "Chemistry", "Arts", "Arts", "Maths", "Maths"]
}

到目前为止,我尝试的是:

代码语言:javascript
运行
复制
function getOccurrences(arr, key) {

  let arr2 = [];

  arr.forEach((x) => {

    if (arr2.some((val) => {
        return val[key] == x[key]
      })) {

      arr2.forEach((k) => {
        if (k[key] === x[key]) {
          k["occurrence"]++
        }
      })
    } else {

      let a = {}
      a[key] = x[key]
      a["occurrence"] = 1
      arr2.push(a);
    }
  })

  return arr2
}


var studentsArray = [{
    "studentId": "1",
    "courses": ["A", "A", "B", "D", "A"],
    "classPeriods": ["Chemistry", "Chemistry", "Maths"]
  },
  {
    "studentId": "1",
    "courses": ["E", "F", "E"],
    "classPeriods": ["Biology", "Chemistry", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["A", "D", "D"],
    "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["G", "K"],
    "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"]
  },
  {
    "studentId": "1",
    "courses": ["A", "B", "D"],
    "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"]
  },
  {
    "studentId": "2",
    "courses": ["A", "C", "F"],
    "classPeriods": ["Arts", "Maths", "Arts", "Maths"]
  },
  {
    "studentId": "2",
    "courses": ["B", "B", "D"],
    "classPeriods": ["Arts", "Arts", "Maths", "Maths"]
  },
  {
    "studentId": "3",
    "courses": ["H", "B", "R"],
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  }
]

getOccurrences(studentsArray, "studentId");

现在我面临的问题是,它没有返回对象的所有属性,也没有合并courseclassPeriods的数组。

我能得到一些帮助吗?

EN

回答 5

Stack Overflow用户

发布于 2022-04-20 23:42:06

这就像是一个简化的教科书样例,但是您可以使用任何类型的循环,最好是使用Map来跟踪id聚合数据对。然后它的values()可以得到实际结果:

代码语言:javascript
运行
复制
var studentsArray = [{
    "studentId": "1",
    "courses": ["A", "A", "B", "D", "A"],
    "classPeriods": ["Chemistry", "Chemistry", "Maths"]
  },
  {
    "studentId": "1",
    "courses": ["E", "F", "E"],
    "classPeriods": ["Biology", "Chemistry", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["A", "D", "D"],
    "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["G", "K"],
    "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"]
  },
  {
    "studentId": "1",
    "courses": ["A", "B", "D"],
    "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"]
  },
  {
    "studentId": "2",
    "courses": ["A", "C", "F"],
    "classPeriods": ["Arts", "Maths", "Arts", "Maths"]
  },
  {
    "studentId": "2",
    "courses": ["B", "B", "D"],
    "classPeriods": ["Arts", "Arts", "Maths", "Maths"]
  },
  {
    "studentId": "3",
    "courses": ["H", "B", "R"],
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  }
];

let stuff=[...studentsArray.reduce((res,student)=>{
  if(!res.has(student.studentId))
    res.set(student.studentId,{...student,occurrences:1});
  else{
    let s=res.get(student.studentId);
    s.courses=s.courses.concat(student.courses);
    s.classPeriods=s.classPeriods.concat(student.classPeriods);
    s.occurrences++;
  }
  return res;
},new Map()).values()];
console.log(stuff);

对于可选/未知的内容:for...in可以循环遍历对象的(枚举)属性,Array.isArray()可以判断某物是否是数组,然后我们可以对in检查采取行动,或者将其作为新属性添加(如果它还不存在),或者连接到现有的属性:

代码语言:javascript
运行
复制
var studentsArray = [{
    "studentId": "1",
    "courses": ["A", "A", "B", "D", "A"],
    "classPeriods": ["Chemistry", "Chemistry", "Maths"]
  },
  {
    "studentId": "1",
    "courses": ["E", "F", "E"],
    "classPeriods": ["Biology", "Chemistry", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["A", "D", "D"],
    "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["G", "K"],
    "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"]
  },
  {
    "studentId": "1",
    "courses": ["A", "B", "D"],
    "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"]
  },
  {
    "studentId": "2",
    "courses": ["A", "C", "F"],
    "classPeriods": ["Arts", "Maths", "Arts", "Maths"]
  },
  {
    "studentId": "2",
    "courses": ["B", "B", "D"],
    "classPeriods": ["Arts", "Arts", "Maths", "Maths"]
  },
  {
    "studentId": "3",
    "courses": ["H", "B", "R"],
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  },
  {
    "studentId": "4",
    "courses": ["H", "B", "R"],
  },
  {
    "studentId": "4",
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  }
];

let stuff=[...studentsArray.reduce((res,student)=>{
  if(!res.has(student.studentId))
    res.set(student.studentId,{...student,occurrences:1});
  else{
    let s=res.get(student.studentId);
    for(let prop in student)
      if(Array.isArray(student[prop]))
        s[prop]=prop in s?s[prop].concat(student[prop]):student[prop];
    s.occurrences++;
  }
  return res;
},new Map()).values()];
console.log(stuff);

看看4如何具有与3相同的数组内容,但是数组来自于两个不同的事件(当然,出现的次数是2)。

票数 1
EN

Stack Overflow用户

发布于 2022-04-20 23:44:11

无需创建a对象..。您可以先将occurrence附加到x,然后再按它。

代码语言:javascript
运行
复制
function getOccurrences(arr, key) {
  let arr2 = [];

  arr.forEach((x) => {

    if (arr2.some((val) => {
        return val[key] == x[key]
      })) {

      arr2.forEach((k) => {
        if (k[key] === x[key]) {
          k["occurrence"]++
        }
      })
    } else {

      // let a = {}
      // a[key] = x[key]
      // a["occurrence"] = 1
      // arr2.push(a);
      x["occurrence"] = 1;   // <-----
      arr2.push(x);          // <-----
    }
  })

  return arr2
}


var studentsArray = [{
    "studentId": "1",
    "courses": ["A", "A", "B", "D", "A"],
    "classPeriods": ["Chemistry", "Chemistry", "Maths"]
  },
  {
    "studentId": "1",
    "courses": ["E", "F", "E"],
    "classPeriods": ["Biology", "Chemistry", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["A", "D", "D"],
    "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"]
  },
  {
    "studentId": "1",
    "courses": ["G", "K"],
    "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"]
  },
  {
    "studentId": "1",
    "courses": ["A", "B", "D"],
    "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"]
  },
  {
    "studentId": "2",
    "courses": ["A", "C", "F"],
    "classPeriods": ["Arts", "Maths", "Arts", "Maths"]
  },
  {
    "studentId": "2",
    "courses": ["B", "B", "D"],
    "classPeriods": ["Arts", "Arts", "Maths", "Maths"]
  },
  {
    "studentId": "3",
    "courses": ["H", "B", "R"],
    "classPeriods": ["Biology", "Biology", "Maths", "Maths"]
  }
]

let result = getOccurrences(studentsArray, "studentId");

console.log(result);
票数 1
EN

Stack Overflow用户

发布于 2022-04-21 00:13:34

您可以使用Array#reduceArray#map,如下所示:

注意到:这结合了所有studentId值的数据;我误解了这个问题。现在我很清楚,您希望函数返回一个ID的结果。参见下一个演示。

代码语言:javascript
运行
复制
const 
studentsArray = [{ "studentId": "1", "courses": ["A", "A", "B", "D", "A"], "classPeriods": ["Chemistry", "Chemistry", "Maths"] }, { "studentId": "1", "courses": ["E", "F", "E"], "classPeriods": ["Biology", "Chemistry", "Biology"] }, { "studentId": "1", "courses": ["A", "D", "D"], "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"] }, { "studentId": "1", "courses": ["G", "K"], "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"] }, { "studentId": "1", "courses": ["A", "B", "D"], "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"] }, { "studentId": "2", "courses": ["A", "C", "F"], "classPeriods": ["Arts", "Maths", "Arts", "Maths"] }, { "studentId": "2", "courses": ["B", "B", "D"], "classPeriods": ["Arts", "Arts", "Maths", "Maths"] }, { "studentId": "3", "courses": ["H", "B", "R"], "classPeriods": ["Biology", "Biology", "Matchs", "Maths"] } ],

getOccurrences = (arr, key) => Object.entries(
  arr.reduce((acc,cur) => 
    acc[cur[key]] ? 
    ({...acc, [cur[key]]: {
        occurrence: acc[cur[key]].occurrence + 1,
        courses: acc[cur[key]].courses.concat(cur.courses),
        classPeriods: acc[cur[key]].classPeriods.concat(cur.classPeriods)
     }}) :
    ({...acc, [cur[key]]: {
        occurrence: 1,
        courses:cur.courses, 
        classPeriods:cur.classPeriods
    }}), {}
  )
)
.map(
    ([studentId,courseInfo]) =>
    ({studentId, ...courseInfo})
);

console.log( getOccurrences(studentsArray,"studentId") );

单ID

本演示中的函数返回studentId的一个值的结果,该值按您的意愿作为key提供:

代码语言:javascript
运行
复制
const 
studentsArray = [{ "studentId": "1", "courses": ["A", "A", "B", "D", "A"], "classPeriods": ["Chemistry", "Chemistry", "Maths"] }, { "studentId": "1", "courses": ["E", "F", "E"], "classPeriods": ["Biology", "Chemistry", "Biology"] }, { "studentId": "1", "courses": ["A", "D", "D"], "classPeriods": ["Computer Science", "Computer Scienc", "Biology", "Biology"] }, { "studentId": "1", "courses": ["G", "K"], "classPeriods": ["Computer Science", "Chemistry", "Biology", "Chemistry"] }, { "studentId": "1", "courses": ["A", "B", "D"], "classPeriods": ["Maths", "Maths", "Biology", "Chemistry"] }, { "studentId": "2", "courses": ["A", "C", "F"], "classPeriods": ["Arts", "Maths", "Arts", "Maths"] }, { "studentId": "2", "courses": ["B", "B", "D"], "classPeriods": ["Arts", "Arts", "Maths", "Maths"] }, { "studentId": "3", "courses": ["H", "B", "R"], "classPeriods": ["Biology", "Biology", "Matchs", "Maths"] } ],

getOccurrences = (arr, key) => {
    let d = arr.filter(({studentId}) => studentId === key);
    return {
        studentId: key,
        occurrence: d.length,
        courses: d.flatMap(({courses}) => courses),
        classPeriods: d.flatMap(({classPeriods}) => classPeriods)
    }
};

console.log( getOccurrences(studentsArray,"1") );

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

https://stackoverflow.com/questions/71947074

复制
相关文章

相似问题

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