JS 数组中对象覆盖问题

在JavaScript中,当数组中存储对象并多次使用`push`方法时,由于引用类型特性,会导致之前对象被覆盖。文章通过示例展示了这个问题,并提出了使用`JSON.parse(JSON.stringify(Obj))`来克隆对象,避免覆盖的解决方案。

JS 数组中对象覆盖问题

问题:数组中存放对象时,多次push的结果呈现总是最后一次添加的内容。

现象:

//第一次push对象
[
    {
        "FC_ATTACHMENT": [],
        "FC_EXCEPTIONTYPE": "制程异常",
        "FC_EXCEPTIONDATE": "2022-08-24",
        "FC_EXCEPTIONTIME": "12:00",
        "FC_EXCEPTIONSYMPTOM": "测试结构",
        "FC_CREATEUSER": "***",
        "FC_DTL_ID": "b425a87e-03df-47f9-810c-35f796acd2c1",
        "FC_BARCODE": "123456789",
        "FC_MODEL": "JY0001"
    }
]
//第二次push不同对象
[
    {
        "FC_ATTACHMENT": [],
        "FC_EXCEPTIONTYPE": "开机异常",
        "FC_EXCEPTIONDATE": "2022-08-23",
        "FC_EXCEPTIONTIME": "12:00",
        "FC_EXCEPTIONSYMPTOM": "测试结构不同不同不同",
        "FC_CREATEUSER": "***",
        "FC_DTL_ID": "e7c39ed7-79e8-4c22-b696-b18d9ff3527b",
        "FC_BARCODE": "123456789",
        "FC_MODEL": "JY0001"
    },
    {
        "FC_ATTACHMENT": [],
        "FC_EXCEPTIONTYPE": "开机异常",
        "FC_EXCEPTIONDATE": "2022-08-23",
        "FC_EXCEPTIONTIME": "12:00",
        "FC_EXCEPTIONSYMPTOM": "测试结构不同不同不同",
        "FC_CREATEUSER": "***",
        "FC_DTL_ID": "e7c39ed7-79e8-4c22-b696-b18d9ff3527b",
        "FC_BARCODE": "123456789",
        "FC_MODEL": "JY0001"
    }
]

错误代码:

this.Tags.push(Obj);

解决方案:

this.Tags.push( JSON.parse(JSON.stringify(Obj)));//将对象进行简单结构,达到指向不同地址的目的
<think> 首先,用户的问题是关于JavaScript数组转换为对象的方法。我需要基于提供的引用内容来回答。 引用内容回顾: - 引用[1]:展示了如何将JavaScript数组转换为JSON字符串,使用`JSON.stringify(fruits)`。 - 引用[2]:讨论了数组对象的互相转换。 - 数组对象:使用`reduce`方法,例如将数组`arr`转换为对象,键是`item.value`,值是`item.label`。 - 对象数组:例如将对象`{0: '男', 1: '女'}`转换为数组。 - 引用[3]:提到了`_.fromPairs`(来自Lodash)将键值对数组转换为对象,以及`Object.entries`将对象转换为数组。 用户明确查询的是“JavaScript数组转换为对象的方法”,所以我需要专注于数组对象的部分。 从引用中提取相关方法: 1. **使用`reduce`方法**:引用[2]中详细说明了如何使用数组的`reduce`方法将数组转换为对象。代码示例为: - `function f(arr) { return arr.reduce((obj, item) => (obj[item.value] = item.label, obj), {}) }` - 这假设数组元素是对象,有`value`和`label`属性。用户可能需要一个更通用的方法。 2. **使用Lodash的`_.fromPairs`**:引用[3]提到`_.fromPairs`可以将键值对数组转换为对象。示例: - `const array = [ ['key1', 'value1'], ['key2', 'value2'] ]; _.fromPairs(array); // { key1: 'value1', key2: 'value2' }` - 这适用于数组元素是子数组的情况。 3. **其他方法**:引用[1]是关于转换为JSON字符串的,不是直接转换为对象,所以不直接相关。但用户可能需要知道,如果数组是简单的值,可以直接赋值。 通用方法: - 如果数组是键值对数组(每个元素是[key, value]数组),可以使用`Object.fromEntries()`,这是现代JavaScript的方法。 - 如果数组是普通值数组,想转换为对象,键可以是索引或特定属性。 我需要确保回答覆盖常见场景: - **场景1:键值对数组对象**:使用`Object.fromEntries()`(ES2019)或Lodash的`_.fromPairs`。 - **场景2:对象数组对象**:使用`reduce`方法,如引用[2]所示。 - **场景3:简单数组对象**:例如,将数组`['a', 'b', 'c']`转换为`{0: 'a', 1: 'b', 2: 'c'}`,可以使用`Object.assign({}, array)`或遍历。 用户的问题没有指定数组结构,所以我应该提供多种方法。 回答结构: 1. **引言**:简要解释数组对象的需求。 2. **方法1**:使用`Object.fromEntries()`(推荐,如果是键值对数组)。 3. **方法2**:使用`reduce`方法(通用,适用于任何结构)。 4. **方法3**:使用Lodash的`_.fromPairs`(如果使用Lodash)。 5. **代码示例**:提供清晰的例子。 6. **注意事项**:提醒用户数组结构的影响。 7. **相关问题**:根据指令生成相关问题。 指令要求: - 使用中文回答。 - 回答结构清晰。 - 在引用的段落末尾添加引用标识,如[^1]。 - 生成相关问题。 - 数学表达式用$...$或$$...$$,但这里可能不需要。 生成相关问题: - 基于主题,如:如何将对象转回数组?性能比较?其他转换方法? 最终回答框架: - 开头:直接回答用户。 - 主体:分点描述方法。 - 结尾:添加相关问题。 </think> ### JavaScript数组转换为对象的方法 在JavaScript中,将数组转换为对象是常见操作,具体方法取决于数组的结构(如元素是否为键值对、普通值或对象)。以下是基于常用场景的几种实现方法,我会逐步解释并提供代码示例。这些方法参考了站内引用内容,并结合了标准JavaScript语法。 #### 1. **使用 `Object.fromEntries()`(推荐,适用于键值对数组)** 如果数组元素是子数组(格式为 `[key, value]`),可以使用ES2019引入的 `Object.fromEntries()` 方法。这是最简洁的方式,无需外部库。 **代码示例:** ```javascript // 示例数组:元素是[key, value]对 const array = [ ['name', 'Alice'], ['age', 30], ['city', 'New York'] ]; // 转换为对象 const obj = Object.fromEntries(array); console.log(obj); // 输出: { name: 'Alice', age: 30, city: 'New York' } ``` **说明:** - 该方法直接接受一个键值对数组,并返回一个新对象。 - 适用于API响应数据或表单数据的转换,效率较高[^3]。 #### 2. **使用 `reduce()` 方法(通用,适用于复杂数组结构)** 如果数组元素是对象或需要自定义键值映射,可以使用数组的 `reduce()` 方法。这是一种灵活的方式,特别适合处理对象数组(如元素有 `id` 和 `value` 属性)。 **代码示例:** ```javascript // 示例数组:元素是对象 const users = [ { id: 1, name: 'Bob' }, { id: 2, name: 'Charlie' }, { id: 3, name: 'Diana' } ]; // 转换为对象,键为 id,值为 name const userObj = users.reduce((obj, item) => { obj[item.id] = item.name; // 自定义键值逻辑 return obj; }, {}); console.log(userObj); // 输出: { 1: 'Bob', 2: 'Charlie', 3: 'Diana' } ``` **说明:** - `reduce()` 方法遍历数组,初始值设为空对象 `{}`,并通过回调函数累积键值对。 - 此方法可灵活适配不同需求,如引用[2]所示,支持简写语法:`arr.reduce((obj, item) => (obj[item.key] = item.value, obj), {})`[^2]。 - 适合处理动态数据,如将API返回的用户列表转换为以ID为键的对象。 #### 3. **使用 Lodash 的 `_.fromPairs()`(依赖外部库)** 如果项目中已使用Lodash库,`_.fromPairs()` 提供了一种快捷方式,功能类似于 `Object.fromEntries()`。 **代码示例:** ```javascript // 先安装Lodash: npm install lodash const _ = require('lodash'); // 示例数组:键值对数组 const pairs = [ ['fruit', 'apple'], ['color', 'red'] ]; // 转换为对象 const obj = _.fromPairs(pairs); console.log(obj); // 输出: { fruit: 'apple', color: 'red' } ``` **说明:** - Lodash的`_.fromPairs()` 能将键值对数组直接转为对象,代码简洁[^3]。 - 适合旧版浏览器环境(如不支持ES2019),但增加额外依赖。 #### 注意事项 - **数组结构影响方法选择**: - 如果数组是简单值(如 `['a', 'b', 'c']`),想转为索引为键的对象(`{0: 'a', 1: 'b', 2: 'c'}`),可用 `Object.assign({}, array)` 或遍历。 - **性能**:`Object.fromEntries()` 通常最快,`reduce()` 适合复杂逻辑。 - **错误处理**:确保数组元素格式正确,否则可能导致键冲突或 `undefined` 值。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值