通过映射和连接两个对象数组来创建对象数组



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

const data = [{
"id": 1,
"content": {
"type": "img",
"state": "rejected"
},
"entity": {
"type": "student",
"studentID": [
44
]
},
"status": "rejected"
},
{
"id": 2,
"content": {
"type": "img",
"state": "approved"
},
"entity": {
"type": "student",
"studentID": [
45
]
},
"status": "approved"
},
{
"id": 3,
"content": {
"type": "img",
"state": "approved"
},
"entity": {
"type": "student",
"studentID": [
44
]
},
"status": "approved"
}
]

可以看到,我们有2个对象,学生id为44(一个状态为拒绝,一个状态为批准),另一个为学生id为45。我有另一个包含学生信息的数组,像这样

const students = [{
student_id: 44,
fname: 'student 1',
lname: '.',
school: 'XYZ',
},
{
student_id: 45,
fname: 'student 2',
lname: '.',
school: 'ABC',
}
]

现在,我想创建一个新的对象数组,它们都被映射,但是数据中的每个对象都映射到它们对应的学生(data中的entity.studentID[0]students中的student_id之间的关系),所以最终的对象数组是

[{
student_id: 44,
fname: 'student 1',
lname: '.',
school: 'XYZ',
item: {
id: 1,
status: "rejected"
},
},
{
student_id: 45,
fname: 'student 2',
lname: '.',
school: 'ABC',
item: {
id: 2,
status: "approved"
},
},
{
student_id: 44,
fname: 'student 1',
lname: '.',
school: 'XYZ',
item: {
id: 3,
status: "approved"
},
},
]

我所做的是我在students上运行了一个循环,并尝试使用map,但这返回给我一个符合条件的对象数组,而不是对象本身。

let arr = []
for (let student of students) {
let obj = { ...student
};
obj["item"] = data.map((p) => {
if (p.entity.studentId[0] === student.student_id) {
return {
id: p.id,
status: p.status,
};
}
});
arr.push(obj);
}

我哪里做错了,我应该怎么做?

你的代码有点复杂,下面是一个更简单的解决方案

let result = data.map(d =>{
let stu = students.find(i => d.entity.studentID.includes(i.student_id))
return {...stu,item:{id:d.id,status:d.status}}
})
console.log(result)

对于您的代码,原因是map将返回undefined,如果它不满足p.entity.studentId[0] === student.student_id

let arr = []
for (let student of students) {
let obj = { ...student
};
obj["item"] = data.map((p) => {
if (p.entity.studentId[0] === student.student_id) {
return {
id: p.id,
status: p.status,
};
}
// will return undefined when not meet the if condition
});
arr.push(obj);
}

工作代码

const data = [{
"id": 1,
"content": {
"type": "img",
"state": "rejected"
},
"entity": {
"type": "student",
"studentID": [
44
]
},
"status": "rejected"
},
{
"id": 2,
"content": {
"type": "img",
"state": "approved"
},
"entity": {
"type": "student",
"studentID": [
45
]
},
"status": "approved"
},
{
"id": 3,
"content": {
"type": "img",
"state": "approved"
},
"entity": {
"type": "student",
"studentID": [
44
]
},
"status": "approved"
}
]
const students = [{
student_id: 44,
fname: 'student 1',
lname: '.',
school: 'XYZ',
},
{
student_id: 45,
fname: 'student 2',
lname: '.',
school: 'ABC',
}
]

let result = data.map(d => {
let stu = students.find(i => d.entity.studentID.includes(i.student_id))
return { ...stu, item:{ id:d.id, status:d.status }}
})
console.log(result)

如果可以的话试试这个:

let newStudent = [];
data.map((data) => {
const studentId = data['entity']['studentID'];
function sts() { return data.status};
students.map((student) => {
const std_id = student.student_id;
if (std_id == studentId) {
newStudent.push({
student_id: std_id,
fname: student.fname,
lname: student.lname,
school: student.school,
id: newStudent.length + 1,
status:  sts()
});
}
})
})

最新更新