javascript - 如何从循环内的函数返回对象列表
问题描述
我正在尝试遍历视图列表,并使用服务调用为每个视图检索与该视图关联的对象列表。每个视图都被分配了最后一次调用函数的结果,而不是函数调用的结果及其参数。
调试服务层方法中的输出语句表明它正在获取正确的值。在循环更新视图后添加对该方法的调用以使用该调用的结果。
我在 Angular2 中的编程经验丰富,以前从未遇到过这个问题,但我看不出我在做什么不同。似乎视图属性被分配了函数而不是函数结果。
搜索问题表明这是一个关闭问题,但我无法获得任何传统解决方案来解决这个问题。
这是我所拥有的:
views.forEach((view: PeriodSummaryView) => {
view.CategorySummaries = API.getCategorySummariesByPeriod(view.Period, new Date()); // every view is given the result of the last evaluation of this function
view.TotalSpent = this.sumAmounts('Spent', view.CategorySummaries);
view.TotalBudgeted = this.sumAmounts('Budgeted', view.CategorySummaries);
});
和 API 层:
export default class API {
static getCategorySummariesByPeriod(filterPeriod: Period, filterDate: Date): CategorySummary[] {
var self = this;
let summaries: CategorySummary[] = Categories.slice();
summaries.forEach((category: CategorySummary) => {
category.Spent = Expenses.filter(function (e) {
return e.CategoryId == category.CategoryId
&& self.isDateInPeriod(filterPeriod, filterDate, e.Date)
}).reduce(function (acc, e) {
return acc + e.Cost;
}, 0);
});
return summaries;
}
}
预期:每个视图都应该有自己的 CategorySummaries 列表,使用其参数从 API 方法中获取。
实际:所有视图都有相同的列表;上次调用 API 方法的结果。
注意: TotalSpent 和 TotalBudgeted 计算正确。
解决方案
forEach 函数不会修改原始数组。您必须创建一个新的空数组并将每个计算项推送到新数组并返回它。
export default class API {
static getCategorySummariesByPeriod(filterPeriod: Period, filterDate: Date): CategorySummary[] {
var self = this;
let summaries: CategorySummary[] = Categories.slice();
let new_arr = [];
summaries.forEach((category: CategorySummary) => {
category.Spent = Expenses.filter(function (e) {
return e.CategoryId == category.CategoryId
&& self.isDateInPeriod(filterPeriod, filterDate, e.Date)
}).reduce(function (acc, e) {
return acc + e.Cost;
}, 0);
new_arr.push(category);
});
return new_arr;
}
}
推荐阅读
- google-cloud-platform - Google Cloud Function 错误 [ReferenceError: publishMessage is not defined]
- c - 将输入字节中的特定位映射到输出字中的特定位
- mysql - how to list a column that a name appears more than once but match two different columns
- jquery - 使用jQuery时页面重新加载?
- asp.net-core-mvc - Asp.Net Core MVC如何处理请求匹配多个端点
- html - 图像变得比定义的大小更大并且超出 div
- ansible - 使用“直到”时将任务输出写入文件
- ruby - 重构口袋妖怪类型的周末
- python - 散点图 ValueError:x 和 y 的大小必须相同
- java - 在 when 子句中使用成员对象的字段创建 Drools