我有一群学生:
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的一个对象应该是:
{
"studentId": "2",
"occurrence": 2,
"courses": ["A", "C", "F", "B", "B", "D"],
"classPeriods": ["Arts", "Maths", "Arts", "Chemistry", "Chemistry", "Arts", "Arts", "Maths", "Maths"]
}到目前为止,我尝试的是:
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");
现在我面临的问题是,它没有返回对象的所有属性,也没有合并course和classPeriods的数组。
我能得到一些帮助吗?
发布于 2022-04-20 23:42:06
这就像是一个简化的教科书样例,但是您可以使用任何类型的循环,最好是使用Map来跟踪id聚合数据对。然后它的values()可以得到实际结果:
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检查采取行动,或者将其作为新属性添加(如果它还不存在),或者连接到现有的属性:
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)。
发布于 2022-04-20 23:44:11
无需创建a对象..。您可以先将occurrence附加到x,然后再按它。
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);发布于 2022-04-21 00:13:34
您可以使用Array#reduce和Array#map,如下所示:
注意到:这结合了所有studentId值的数据;我误解了这个问题。现在我很清楚,您希望函数返回一个ID的结果。参见下一个演示。
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提供:
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") );
https://stackoverflow.com/questions/71947074
复制相似问题