JavaScript如何将对象数组转换为指定结构的对象
核心前提说明
JavaScript 普通对象不允许存在重复的键,你给出的目标结构中三个键均为Hari Libur,实际运行时只会保留最后一个键对应的值,前面的条目会被完全覆盖,该结构本身不具备实用性,更建议你改用数组存储所有假期日期。
为什么Object.assign会出现数字索引键
你之前应该是直接把数组作为参数传入Object.assign,示例如下:
// 错误写法示例 const wrongResult = Object.assign({}, inputArray)
数组本身属于类数组对象,数字索引是它的可枚举自有属性,Object.assign会把所有源对象的可枚举自有属性复制到目标对象,因此就出现了0、1、2这类数字键。
实现方案
方案1:推荐的合法结构(保留所有数据)
把所有假期条目存为Hari Libur键对应的数组,不会丢失数据:
const input = [ { "Hari Libur":{ "date":"12-07" } }, { "Hari Libur":{ "date":"12-12" } }, { "Hari Libur":{ "date":"12-04" } }] const result = { "Hari Libur": input.map(item => { // 把日期中的-替换为/ const formattedDate = item["Hari Libur"].date.replaceAll('-', '/') return { date: formattedDate } }) }
输出结果:
{ "Hari Libur": [ { date: "12/07" }, { date: "12/12" }, { date: "12/04" } ] }
方案2:仅保留最后一个条目(匹配你给出的目标结构特性)
如果你坚持要单键结构,最终只会保留最后一个假期条目:
const result = input.reduce((acc, cur) => { const formattedDate = cur["Hari Libur"].date.replaceAll('-', '/') // 重复赋值会覆盖之前的同键值 acc["Hari Libur"] = { date: formattedDate } return acc }, {})
输出结果:
{ "Hari Libur": { date: "12/04" } }
内容的提问来源于stack exchange,提问作者Bagus Amrullah Fikri
相关产品推荐
相关产品推荐

