Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修改过滤数组会导致修改原始数组_Javascript_Arrays_Filter - Fatal编程技术网

Javascript 修改过滤数组会导致修改原始数组

Javascript 修改过滤数组会导致修改原始数组,javascript,arrays,filter,Javascript,Arrays,Filter,我很感激对这方面的任何见解。我对.filter的理解是,若它找到任何数据,它将创建一个全新的数组,其中包含过滤后的数据。我有一段代码: const pieChartData = data.reduce((newList, item) => { const {chg_organization_zChgManager_combo_name} = item; const hasName = newList.filter(item => item.name =

我很感激对这方面的任何见解。我对.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_名称显示的每个事件创建一个值,以便我们可以构建一个图表,显示分配给所述经理的项目数量


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

.filter()
创建一个新数组。但是如果元素是对象,它们是对相同对象的引用,它不会进行深度复制。我明白了,谢谢你。那么,这是否意味着我必须创建一个新变量并将对象分配给它,以便不可变地修改它?或者在这一点上是不可能的?看到了吗