gpt4 book ai didi

javascript - 动态创建的对象在尝试访问其键值时返回未定义

转载 作者:行者123 更新时间:2023-12-01 01:26:26 25 4
gpt4 key购买 nike

我有一个看起来像这样的学生对象...

{
Freshmen: [{id: 3}, {id: 5}],
Sophomores: [{id: 2}, {id: 6}],
Juniors: [{id: 1}, {id: 8}],
Seniors: [{id: 9}, {id: 4}, {id: 7}]
}

我需要根据数组中的 id 查找学生。我需要返回的是一个看起来完全相同的对象,但是我现在从数据库中检索了完整的对象,而不是只包含 id 的对象。

在我的 Angular component.ts 文件中,我尝试通过以下方式执行此操作...

  private getStudents(obj) {
const result = {};
for (const key of Object.keys(obj)) {
obj[key].map(item => {
this.studentsService.geStudentById(item.id).subscribe(res => {
result[key] = [];
result[key].push(res);
});
});
}
return result;
}

我已将服务注入(inject)到组件中。该服务有一个通过 id 获取学生的方法,我在 getStudents() 中调用该服务方法。该服务返回相应的学生对象,然后我将其插入数组中。

后来我调用该函数并将结果分配给变量studentDetails,如下所示...

this.studentDetails = this.getStudents(studentObj);

一切似乎都工作正常,除了当我尝试执行... console.log(this.StudentDetails.Freshmen); 例如,我得到 undefined

我是否以正确的方式处理这个问题,或者是否有更好的方法可以处理它,例如使用arr.reduce()而不是arr.map()?尽管我尝试过减少,但由于某种原因它只返回一项。我们将非常感谢您的帮助。

最佳答案

问题是您的 return 语句在异步 getStudentById() 请求完成之前执行。

我建议使用RxJS然后将您的请求压缩在一起,并在获得请求的所有结果后对数据执行某些操作。

使用 RxJS,你的函数可能如下所示:

private getStudents(obj) {
const result = {};

// Array to store all the observables
let observables: Observables<void>[] = [];

// Generate all the observables with the respective parameters
for (const key of Object.keys(obj)) {
obj[key].map(item => {
observables.push(
this.studentsService.geStudentById(item.id)
.map(res => {
result[key] = [];
result[key].push(res);
});
});
);
}

// Zip them together and wait for all of them to emit a value
of(...observables)
.pipe(zipAll())
.subscribe(() => {
return result;
});
}

此外,一次获取所有学生然后过滤它们,而不是仅针对单个学生发出多个请求(取决于学生的数量),性能可能会更好。

关于javascript - 动态创建的对象在尝试访问其键值时返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53724517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com