javascript - 修改过滤后的数组导致原始数组被修改
问题描述
我很感激对此的任何见解。我对 .filter 的理解是,如果找到任何过滤数据,它会创建一个全新的数组。我有一段代码:
const pieChartData = data.reduce((newList, item) => {
const {chg_organization_zChgManager_combo_name} = item;
const hasName = newList.filter(item => item.name === chg_organization_zChgManager_combo_name);
if (hasName.length > 0) {
hasName[0].value++;
return [...newList, ...hasName];
} else {
return [...newList, {'name': chg_organization_zChgManager_combo_name, 'value': 1}]
}
}, []);
这会中断并进入一个巨大的无限循环。然而,如果我运行这个稍微修改过的版本,它会完全按照预期工作:
const pieChartData = data.reduce((newList, item) => {
const {chg_organization_zChgManager_combo_name} = item;
const hasName = newList.filter(item => item.name === chg_organization_zChgManager_combo_name);
if (hasName.length > 0) {
hasName[0].value++;
return newList;
} else {
return [...newList, {'name': chg_organization_zChgManager_combo_name, 'value': 1}]
}
}, []);
我最初的猜测是,它实际上不是创建一个全新的数组,而是创建一个实例,并且在修改数组的实例时,它会修改创建该实例的数组(因此修改它是可变的,而不是像我试图做的那样不可变) .
这个 reduce 函数获取一个对象数组并构建一个新的对象数组,最终将创建一个 chg_organization_zChgManager_combo_name 出现的每个出现的值,因此我们可以构建一个图表,说明分配给所述经理的项目数。
感谢任何反馈,因为我真的希望代码的第一个版本能够按预期工作。
解决方案
推荐阅读
- azure - azcopy 8.1 总是上传内容类型错误的图像 application/octet-stream
- vb.net - 使用一个按钮切换启用和禁用所有按钮
- java - Java 文件删除方法未按预期工作
- java - intellij idea 不再将新的 gradle 模块导入我的项目
- asp.net - .NET 基于角色的资源访问 - 最佳实践
- latex - subfig 包在投影仪中给出错误“未定义的控制序列。\begin{document}”错误
- mysql - 连接两个表以返回一个表中的所有行及其在另一个表中的状态
- graphql - 如何在模式中实现 GraphQL 片段?
- asp.net-mvc - 如何使用cookie在浏览器中打开页面?
- ms-access - 同时计算多个平均命令