从数组和多维数组创建 JSON 对象

Posted

技术标签:

【中文标题】从数组和多维数组创建 JSON 对象【英文标题】:Create JSON object from Array and Multi-Dimensional Array 【发布时间】:2022-01-19 06:04:17 【问题描述】:

我有这个 JSON 对象:


  "columnNames": [
    "Incident ID",
    "IncidentType"
  ],
  "rows": [
    [
      "3599590",
      "Telecommuting/VWA Empl- Initiate"
    ],
    [
      "3599601",
      "Telecommuting/VWA Empl- Initiate"
    ]
  ]

我想将 javascript 中的那个对象转换成这个对象:


  reportResults: [
      "Incident ID": "3599590",
      "IncidentType": "Telecommuting/VWA Empl- Initiate"
    ,
    
      "Incident ID": "3599591",
      "IncidentType": "Telecommuting/VWA Empl- Initiate"
    
  ]

我已经尝试在以下示例中使用推送功能:

VWA_Output = 
  "columnNames": [
    "Incident ID",
    "IncidentType"
  ],
  "rows": [
    [
      "3599590",
      "Telecommuting/VWA Empl- Initiate"
    ],
    [
      "3599601",
      "Telecommuting/VWA Empl- Initiate"
    ]
  ]
;

JSTest_JSON_Var1 = 
  reportResults: []
;
for (i in VWA_Output.rows) 
  for (var j in VWA_Output.rows[i]) 
    var key = VWA_Output.columnNames[j];
    var value = VWA_Output.rows[i][j]
    JSTest_JSON_Var1.reportResults.push(
      [key]: value
    );

  

console.log(JSTest_JSON_Var1);

但是,它似乎使用集合作为单独的数组元素来创建这样的对象:


  [
    "reportResults": [
        "Incident ID": "3599590"
      , 
        "IncidentType": "Telecommuting/VWA Empl- Initiate"
      
    ,
    
      "Incident ID": "3599591"
    ,
    
      "IncidentType": "Telecommuting/VWA Empl- Initiate"
    
  ]

我希望列和行的集合成为数组中的单个记录集合:


  "reportResults": [
    "Incident ID": "3599590",
    "IncidentType": "Telecommuting/VWA Empl- Initiate"
  , 
    "Incident ID": "3599591",
    "IncidentType": "Telecommuting/VWA Empl- Initiate"
  ]

谢谢!

【问题讨论】:

如果您在内循环之前创建一个空对象,您尝试的方法可能会起作用。然后在内循环内部将键和值分配给它作为obj[key] = value,最后在内循环外部将该对象推送到JSTest_JSON_Var1.reportResults。但我认为你应该选择下面提供的更具可读性的答案。 所有提供的方法都通过我在浏览器中的测试工作。我正在使用 Oracle SOA Suite 中的 Javascript 组件来执行解析和对象重建,不幸的是它不喜欢 map 函数调用(该组件基于 Mozilla Rhino Javascript 引擎)。我最终按照airer301的建议更改了我的原始代码以推入外循环。 【参考方案1】:

一次性定义reportResults - 使其内容是从rows 映射的数组,您可以在其中使用要迭代的列名的索引来访问适当的行值。我会使用Object.fromEntries 来保持简洁。

const input = 
  "columnNames": [
    "Incident ID",
    "IncidentType"
  ],
  "rows": [
    [
      "3599590",
      "Telecommuting/VWA Empl- Initiate"
    ],
    [
      "3599601",
      "Telecommuting/VWA Empl- Initiate"
    ]
  ]
;
const output = 
  reportResults: input.rows.map(row => Object.fromEntries(
    input.columnNames.map((name, i) => [name, row[i]])
  ))
;
console.log(output);

【讨论】:

【参考方案2】:

假设您的示例数据位于data

const result = 
  "reportResults" : data.rows.map(row => 
    return 
      [data.columnNames[0]]: row[0],
      [data.columnNames[1]]: row[1]
    
  )

【讨论】:

【参考方案3】:

这是我的解决方案:

var data = 
  "columnNames": [
    "Incident ID",
    "IncidentType"
  ],
  "rows": [
    [
      "3599590",
      "Telecommuting/VWA Empl- Initiate"
    ],
    [
      "3599601",
      "Telecommuting/VWA Empl- Initiate"
    ]
  ]


var reportResults = data.rows.map((row) => 
    Object.assign(, ...row.map((cell, i) => ( [data.columnNames[i]]: cell)))
)

console.log(reportResults)

不是最佳的,但很短)

【讨论】:

【参考方案4】:

请参阅上面的我的 cmets。提供的每个答案都在浏览器中有效,但在我使用的 SOA Suite Javascript 组件中无效。该组件不喜欢 map 函数调用。再次感谢所有回复。

以下是 Oracle SOA Suite JS 组件的工作原理:

process.VWA_Output = 
  "columnNames": [
    "Incident ID",
    "IncidentType"
  ],
  "rows": [
    [
      "3599590",
      "Telecommuting/VWA Empl- Initiate"
    ],
    [
      "3599601",
      "Telecommuting/VWA Empl- Initiate"
    ]
  ]
;
process.JSTest_JSON_Var1 =  
  reportResults: [] 
; 

for (i in process.VWA_Output.rows)  
  const row = new Object(); 
  for (var j in process.VWA_Output.rows[i])  
    var key = process.VWA_Output.columnNames[j]; 
    var value = process.VWA_Output.rows[i][j]; 
    row[key] = value; 
   
  process.JSTest_JSON_Var1.reportResults.push(row); 

【讨论】:

以上是关于从数组和多维数组创建 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

多维数组上的 json_encode() - 带有字符串键

如何将多维数组转换为json对象[关闭]

如何反序列化包含多维数组的json对象?

json 格式 多维数组

创建多维文件数组和修改日期

使用Jettison的多维数组