问题描述
我有以下JSON数据->
{
"data": [
{
"documentId": "new_148_45646","data": "new_data6"
},{
"documentId": "new_145_456","data": "new_data1"
},{
"documentId": "new_148_4546","data": "new_data2"
},"data": "new_data3"
},"data": "new_data6"
}
]
}
我想将其转换为以下扁平树数据
{
"treeData": [
{
"documentId": "new_148_45646","expandable": true,"level": 0
},{
"documentId": "new_148_45646","expandable": false,"level": 1,"data": "new_data6"
},{
"documentId": "new_145_456","data": "new_data1"
},"data": "new_data3"
},{
"documentId": "new_148_4546","data": "new_data2"
},"data": "new_data6"
}
]
}
因此,如果原始数组中只有一个元素具有唯一的documentId,则它将被转换
到2个节点->具有documentid级别0,expandable = true的一个节点和具有相同documentid,expandable = false,级别1 data的另一个节点。
如果原始数组中有2个具有相同documentId的元素,则将其转换
到3个节点-> 1个具有documentid,级别0,expandable = true的节点和2个具有相同documentid,expandable = false的节点,级别1,数据
如果原始数组中有3个元素具有相同的documentId,则它将被转换
到4个节点->具有documentid级别0,expandable = true的一个节点和具有相同documentid,expandable = false,级别1的3个节点的数据
数据将始终仅保留到1级。
有人可以帮我这个忙吗?谢谢
解决方法
可能不是最好的代码,但是它是单行代码-因此总比没有行更好:p
const input = {
"data": [
{
"documentId": "new_148_45646","data": "new_data6"
},{
"documentId": "new_145_456","data": "new_data1"
},{
"documentId": "new_148_4546","data": "new_data2"
},"data": "new_data3"
},"data": "new_data6"
}
]
}
const output = [...input.data.reduce((a,{documentId,data})=>(a.set(documentId,(a.get(documentId)||[]).concat([{documentId,expandable:false,level:1,data,}])),a),new Map)].flat().flatMap(i=>typeof i==='string'?({documentId:i,expandable:true,level:0}):i);
console.log(output)