首页 > 解决方案 > 修改过滤后的数组导致原始数组被修改

问题描述

我很感激对此的任何见解。我对 .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 出现的每个出现的值,因此我们可以构建一个图表,说明分配给所述经理的项目数。

感谢任何反馈,因为我真的希望代码的第一个版本能够按预期工作。

标签: javascriptarraysfilter

解决方案


推荐阅读