如何将具有重复字段值的表格数据转换为层次结构的 JSON?

Posted

技术标签:

【中文标题】如何将具有重复字段值的表格数据转换为层次结构的 JSON?【英文标题】:How to convert tabular data with repeat field values into a hierarchical structured JSON? 【发布时间】:2020-08-17 20:36:01 【问题描述】:

我已转换以下 CSV 文件

Col1;Col2
1;b
2;d
2;e
3;e
2;zz

进入以下[ ][ ](关联数组)

[
  ["Col1","Col2"],
  ["1","b"],
  ["2","d"],
  ["2","e"],
  ["3","g"],
  ["2","zz"]
]

另一种可能性是 CSV 行的数组,其中列使用扩展运算符映射到一个对象,我从许多搜索中找到了 :)。这种方法自然会处理更多的列。

[
0:"Col1", 1:"Col2",
0:"1", 1:"b",
0:"2", 1:"d",
...
0:"2", 1:"zz",
]

但是,我想让 JSON “分层”并处理重复的字段值,这里从左列“Col1”开始,以便派生以下 JSON


"1":["b"],
"2":["d","e","zz"],
"3":["g"]

你会怎么做呢?

当然,我们可以将问题概括为 n 列数据,其中我们可以有多个具有重复值的列(从左到右)。

我的大部分搜索似乎都针对重复数据删除,这不是我的情况,我想排除重复字段,如图所示。我可以想象一个迭代方法,但我希望有人有一个 .map() 也许?紧凑/优雅的方法。

谢谢。

【问题讨论】:

这感觉好像已经在这里的某个地方得到了回答,您是否尝试过查看 Array mapreduce 方法?它们通常对这样的东西很方便。此外,您的第一个 JSON 应该会失败,因为它有重复的密钥标识符。 在昨晚的搜索中,我最接近的是这篇使用 JSONObject.accumulate() 的帖子,但后来我意识到它是 JAVA :( 我很难弄清楚我该怎么做 .map 将重复字段“分解”到数组的单个条目中?***.com/questions/24416960/… 好的,我会添加一个答案让你开始! :-) 【参考方案1】:

const initArray = [
   0: 'Col1', 1: 'Col2' ,
   0: '1', 1: 'b' ,
   0: '2', 1: 'd' ,
  ... 0: '2', 1: 'zz' ,
];

reduce 肯定有一种更简洁的方法,但我将通过 map 的方法作为开始。

    const desiredKeys = initArray.map(element => element["0"]),这将为您提供一个包含每个所需键作为元素的数组,即["1","2",...,"2"] desiredKeysNoDuplicates = [...new Set(desiredKeys)] 删除重复项,所以我们会有类似 ["1","2"] 的内容 desiredKeysNoDuplicates.map(element => initArray.map(originalElement => originalElement["0"] === element ? originalElement["1"]: undefined)) 将获取键并在原始数组中查找具有匹配键的元素并从键 1 返回它们的值

【讨论】:

好的,您选择了要处理的对象数组[ ... ]。我并不是建议您必须使用.map,感谢您展示了它有帮助的 1,2,3 步骤。我正在学习像...new Set(desiredKeys) 这样的新东西,尽管我承认在一个月左右的时间里我不知道这意味着什么。我很好奇您的reduce 方法,请作为单独的答案分享。

以上是关于如何将具有重复字段值的表格数据转换为层次结构的 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何将具有重复索引值的数据框转换为字典

如何将具有重复值的行转换为列?

如何最好地使用正则表达式将层次文本文件转换为 XML?

如何选择具有字段重复值的每一行

如何将结构转换为具有完全相同字段名称和类型的另一个结构?

将分隔字段转换为具有名称和值的行