JavaScript如何根据数组对象phoneNumbers子项拆分复制对应元素
错误原因
你的代码运行异常和循环等待没有任何关系,核心问题是 对象引用共享:
- JavaScript中对象是引用类型,你在循环中直接修改了原数组里的
arr[i]对象的phoneNumbers字段,而push到结果数组的所有条目都是该原对象的引用,不是独立的新对象。 - 每次内层循环j都会覆盖
phoneNumbers的值,最终结果中同一个联系人的所有条目都会指向最后一次修改的phoneNumbers,比如name1的两条记录最终都会保留mobile号码,丢失home号码。 - 额外说明:你定义的
doSomeRecursion函数实际没有用到递归逻辑,命名与实现不符。
简洁实现方案
直接使用数组的flatMap方法即可高效完成转换,不会修改原数组和原对象:
const getAllContacts = contacts => contacts.flatMap(contact => // 对每个电话条目生成独立的新联系人对象 contact.phoneNumbers.map(phoneItem => ({ ...contact, // 复制原联系人的其他字段 phoneNumbers: [phoneItem] // 仅保留当前单条电话记录 })) )
实现逻辑说明:flatMap会先遍历每个联系人,对每个联系人的所有电话条目生成对应的新联系人对象,最后自动把所有子数组合并为一维数组,完全符合你的转换要求。
内容的提问来源于stack exchange,提问作者Nicks
相关产品推荐
相关产品推荐

