如何在JavaScript中从aaa数组创建指定结构的对象?
问题描述
给定如下JavaScript数组:
const aaa = [ { "objectid": 111, "userid": "1", "associationid": "123" }, { "objectid": 111, "userid": "2", "associationid": "456" } ];
需要生成指定结构的对象:{"objectid": "111", "contacts" : [{"isdelete": "1", "contactid": "1", "associationid":"123"},{"isdelete": "1", "contactid": "2", "associationid":"456"}]}
尝试用reduce方法实现但未成功,代码如下:
aaa.reduce((accumulator, {objectid,userid,associationid}) => ({ ...accumulator, "objectid": objectid, "contacts": (accumulator["contacts"] || []).push(({"isdelete": "1", "contactid": userid, associationid})) }), {})
问题分析与解决
你的代码失效核心原因是**Array.push()返回的是数组新长度,而非修改后的数组本身**,这会导致contacts最终被赋值为数字,而非预期的数组结构。
正确实现方式如下:
const result = aaa.reduce((accumulator, { objectid, userid, associationid }) => ({ ...accumulator, objectid: String(objectid), // 原objectid为数字,按期望转成字符串类型 contacts: [ ...(accumulator.contacts || []), { isdelete: "1", contactid: userid, associationid } ] }), {}); console.log(result);
关键细节说明:
- 使用扩展运算符
...展开原有contacts数组(或空数组),再追加新的联系人对象,确保返回的是完整数组而非push的长度值。 - 示例中原数组的
objectid是数字类型,而期望结果为字符串,因此用String(objectid)做类型转换(若不需要转换可直接保留原数值)。 - 假设数组中所有元素的
objectid一致,若存在多objectid分组需求,需额外添加分组逻辑,本实现基于示例数据默认统一objectid处理。
内容的提问来源于stack exchange,提问作者Karim Ali
相关产品推荐
相关产品推荐

