如何将具有重复字段值的表格数据转换为层次结构的 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() 也许?紧凑/优雅的方法。
谢谢。
【问题讨论】:
这感觉好像已经在这里的某个地方得到了回答,您是否尝试过查看 Arraymap
和 reduce
方法?它们通常对这样的东西很方便。此外,您的第一个 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?的主要内容,如果未能解决你的问题,请参考以下文章