delete方法删除对象数组中元素导致原始数据被修改

news2024/11/17 13:53:26

记录一个自己在码代码过程中遇到的问题。

        要求:删除数组对象中每一组对象中的一个属性。

        下面是我原始的写法(当然是错误的)。

const { log } = require("console");

//  用于测试delete方法,删除对象中的指定元素
const testForDelete = () => {

    //  定义一个对象数组
    const oraObjInfo = [{ id: 1, name: "小明", sex: "男", age: 12, remark: "小明是个好孩子" }];
    //  重新拷贝数据到新的常量中。
    const copiedObjInfo = [...oraObjInfo];

    // 用来保存修改过后的数据
    const deletedData = [];
    copiedObjInfo.forEach(e => {
        //  这里删除 remark属性 
        delete e.remark;
        deletedData.push(e);
    });

    log("原始数据", oraObjInfo);
    log("结果数据", deletedData);
};

testForDelete();

下面是运行结果

 

         由运行结果可以看出,删除操作后,原始数据(oraObjInfo)的remark属性也被删除了。 如果后面要使用原始数据中的remark属性的话,就取不到对应的值了。

        以上问题的主要原因在于拷贝数据的时候没有进行深层拷贝。这就需要考虑js中的深层拷贝了。

        我代码中用的是ES6扩展运算符(...),但是这个拷贝只能针对单层的数据才能深拷贝,多层的就不行了。因此我又试着用了其他方法。

        方法一:在拷贝的时候确定进行深拷贝,再进行操作。

                        深拷贝方法:JSON.parse( JSON.stringify (需要拷贝的数据) )

                        具体代码如下:

const { log } = require("console");

//  用于测试delete方法,删除对象中的指定元素
const testForDelete = () => {

    //  定义一个对象数组
    const oraObjInfo = [{ id: 1, name: "小明", sex: "男", age: 12, remark: "小明是个好孩子" }];
    //  重新拷贝数据到新的常量中。(一定要是深拷贝,用 ... 拷贝不行)
    const copiedObjInfo = JSON.parse(JSON.stringify(oraObjInfo));

    // 用来保存修改过后的数据
    const deletedData = [];
    copiedObjInfo.forEach(e => {
        //  这里删除 remark属性 
        delete e.remark;
        deletedData.push(e);
    });

    log("原始数据oraObjInfo", oraObjInfo);
    log("结果数据deletedData", deletedData);
};

testForDelete();

        运行结果如下:

这样,原始数据就没有被改变了。

         方法二:在删除操作之前做单层的拷贝后再删除。

const { log } = require("console");

//  用于测试delete方法,删除对象中的指定元素
const testForDelete = () => {

    //  定义一个对象数组
    const oraObjInfo = [{ id: 1, name: "小明", sex: "男", age: 12, remark: "小明是个好孩子" }];
 
    // 用来保存修改过后的数据
    const deletedData = [];
    oraObjInfo.forEach(e => {
        //  在这里用 ... 方法进行单层的深度拷贝
        const temp = {...e};
        //  这里删除 remark属性 
        delete temp.remark;
        deletedData.push(temp);
    });

    log("原始数据oraObjInfo", oraObjInfo);
    log("结果数据deletedData", deletedData);
};

testForDelete();

运行结果:

以上仅仅是我自己的理解。要是有什么不对的地方,请大家多多指导。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【中创数智人】“周杰伦?数智人周同学!”7×24小时直播不间断,他做到了

迈进Web 3.0,离不开数智人。 品牌代言、公司宣传、产品介绍、直播带货......数智人扮演的角色正在不断增加。无论是替代真人服务、多模态AI助手、还是作为虚拟世界的第二分身,对于数智人而言都已经是触手可及的未来。 5月8日,周杰伦亮相中国…

【JavaEE】线程安全(难点)

目录 前言 1、线程安全的概念 2、线程不安全的原因 3、产生抢占式执行与原子性问题 4、产生多个线程修改同一个变量的问题 5、解决上述三个导致线程不安全的问题 5.1、锁 synchronized关键字 5.1.1、使用synchronized关键字进行加锁 6、由内存可见性引起的线程不安全…

KubeEdge节点分组特性简介

01 边缘应用跨地域部署场景及问题 应用生命周期管理复杂导致运维成本提高 02 边缘节点分组管理 节点分组:将不同地区的边缘节点按照节点组的形式组织 边缘应用:将应用资源整体打包并满足不同节点组之间的差异化部署需求 流量闭环:将服务流量…

Oracle内存管理

文章目录 概念内存管理方式自动内存管理自动共享内存管理手工内存管理 内存管理的转换方式相关内存参数相关数据字典 概念 为满足数据库的需求,通过内存管理来维护 Oracle 实例内存结构的最优大小。Oracle数 据库基于与内存相关的初始化参数设置来管理内存。 内存管…

【LeetCode】654. 最大二叉树

1.问题 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最…

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及,美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时,实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是,在享受美颜SDK带来的便利的同时,我们也需要关注美颜SDK的隐私保护与…

跟着排序学时间复杂度

带着排序学时间/空间复杂度 排序和时间复杂度 带着排序学时间/空间复杂度冒泡排序选择排序选择排序法2原理: 插入排序希尔排序(缩小增量排序)堆排序快速排序归并排序不基于比较的排序计数排序 桶排序稳定性 时间复杂度是打开数据结构大门的第…

从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

Vitest 是个高性能的前端单元测试框架,它的用法其实和 Jest 差不多,但是它的性能要优于 Jest 不少,还提供了很好的 ESM 支持,同时对于使用 vite 作为构建工具的项目来说有一个好处就是可以公用同一个配置文件vite.config.js。因此本项目将会使用 Vitest 作为测试框架。 安装 …

FS2956A 8V~120V降压5V2A4.2V3A恒压芯片

FS2956A 内置MOS 100V开关降压型DC-DC转换器,FS2956A 8-100V用于电动车 滑板车 液晶仪表 5V-USB充电IC方案2A 概述: FS2956A 是一款支持宽电压输入的开关降压型DC-DC,芯片内置100V/5A功率MOS,最高输入电压90V。FS2956A 具有低待…

初识滴滴交易策略之一:交易市场

初识系列前言 滴滴作为一家共享出行公司,利用信息技术构建了实时的、智能的在线交易市场,在这个庞大运转的市场之中,滴滴秉承着用户价值至上的宗旨,不断通过技术提升来实现更高效的运转效率和更贴心的用户体验。 为了使得大家能够…

蚂蚁实时低代码研发和流批一体的应用实践

摘要:本文整理自蚂蚁实时数仓架构师马年圣,在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为四个部分: 1. 实时应用场景与研发体系 2. 低代码研发 3. 流批一体 4. 规划展望 Tips:点击「阅读原文」查看原文视频&a…

KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障

​ KingbaseES V8R6备份恢复案例之---system-Id不匹配备份故障 案例说明: 在KingbaseES V8R6执行备份时,在sys_log日志中出现system-id不一致的故障并伴随有归档失败,故障如下图所示: 适用版本: KingbaseES V8R6 一、问…

React 学习笔记

文章目录 React 简介React 特点React 学习前提React 第一个实例 React 简介 React 是一个用于构建用户界面的 JAVASCRIPT 库。 React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。 React 起源于 Facebook 的内部项目,用…

Flink窗口

目录 窗口 Flink “存储桶” 窗口分类 按照驱动类型分类 按照窗口分配数据的规则分类 滚动窗口 滑动窗口 会话窗口 全局窗口 窗口的生命周期 窗口 窗口:将无限数据切割成有限的“数据块”进行处理,以便更高效地处理无界流 在处理无界数据流时…

3.1 掌握绘图基础语法与常用参数

3.1 掌握绘图基础语法与常用参数 3.1.1 掌握pyplot基础语法1.创建画布与创建子图2.添加画布内容3.保存与展示图形 3.1.2 设置pyplot的动态rc参数线条常用的rc参数 Matplotlib库介绍 Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表…

实验二十、压控电压源二阶 LPF 幅频特性的研究

一、题目 研究压控电压源二阶低通滤波电路品质因数 Q Q Q 对频率特性的影响。 二、仿真电路 电路如图1所示。集成运放采用 LM324AJ,其电源电压为 15V。 图 1 压控电压源二阶低通滤波电路幅频特性的测试 图1\,\,压控电压源二阶低通滤波电路幅频特性的测试 图1压控…

记录一次重装系统配置工作环境

128G固态换大硬盘,偷懒不想重装系统,利用diskgenius迁移系统,热迁移和PE都没能成功迁移,还不小心删掉了机械盘的所有分区。利用diskgenius搜索分区,恢复文件,勉强把一些数据文件保存下来了。但是软件又得重…

DOM是什么(DOM的节点类型)

学到DOM时,看到关于文档(结构树)、节点(node)、和DOM提供的一些方法获取(找到)所需的节点、还有DOM属性,我很混乱,我无法弄清节点的关系层级属性和方法的关系&#xff0c…

SQL常用语句总结

一,简介 1.1 数据库是用来存放数据的,对数据库的操作需要用到SQL语句 1.2 数据库种类有也非常多: 关系型数据库: Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite 非关系型数据库: NoSql、Cl…

Vue Cli 之 环境变量和模式

一、环境变量 ​ 我们在使用 Vue-cli 创建的Vue项目中,可以在构建和运行时为项目设置环境变量,这些环境变量会根据环境(模式)的不同,而自动注入到项目中,也就是说我们可以根据环境不同,设置不同…