如何使用 Javascript/Typescript 为 Angular 树的平面数组创建数据
How to create data for Flat Array for Angular Tree using Javascript/Typescript
我有以下 JSON 数据 ->
{
"data": [
{
"documentId": "new_148_45646",
"data": "new_data6"
},
{
"documentId": "new_145_456",
"data": "new_data1"
},
{
"documentId": "new_148_4546",
"data": "new_data2"
},
{
"documentId": "new_145_456",
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"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",
"expandable": true,
"level": 0
}, {
"documentId": "new_145_456",
"expandable": false,
"level": 1,
"data": "new_data1"
},
{
"documentId": "new_145_456",
"expandable": false,
"level": 1,
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"expandable": true,
"level": 0
}, {
"documentId": "new_148_4546",
"expandable": false,
"level": 1,
"data": "new_data2"
},
{
"documentId": "new_148_4546",
"expandable": false,
"level": 1,
"data": "new_data6"
}
]
}
所以如果原始数组中有一个元素具有唯一的documentId,那么它将被转换
到 2 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和另一个具有相同 documentid,expandable=false,级别 1,数据的节点节点。
如果原始数组中有 2 个具有相同 documentId 的元素,则它将被转换
到 3 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和 2 个节点具有相同的 documentid,expandable=false,级别 1,data
如果原始数组中有 3 个具有相同 documentId 的元素,则它将被转换
到 4 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和 3 个节点具有相同的 documentid,expandable=false,级别 1,data
数据将一直保持到第 1 级。
有人可以帮我解决这个问题吗?谢谢
可能不是最好的代码,但它是 one-liner - 所以总比没有行好 :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"
},
{
"documentId": "new_145_456",
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"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)
我有以下 JSON 数据 ->
{
"data": [
{
"documentId": "new_148_45646",
"data": "new_data6"
},
{
"documentId": "new_145_456",
"data": "new_data1"
},
{
"documentId": "new_148_4546",
"data": "new_data2"
},
{
"documentId": "new_145_456",
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"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",
"expandable": true,
"level": 0
}, {
"documentId": "new_145_456",
"expandable": false,
"level": 1,
"data": "new_data1"
},
{
"documentId": "new_145_456",
"expandable": false,
"level": 1,
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"expandable": true,
"level": 0
}, {
"documentId": "new_148_4546",
"expandable": false,
"level": 1,
"data": "new_data2"
},
{
"documentId": "new_148_4546",
"expandable": false,
"level": 1,
"data": "new_data6"
}
]
}
所以如果原始数组中有一个元素具有唯一的documentId,那么它将被转换
到 2 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和另一个具有相同 documentid,expandable=false,级别 1,数据的节点节点。
如果原始数组中有 2 个具有相同 documentId 的元素,则它将被转换
到 3 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和 2 个节点具有相同的 documentid,expandable=false,级别 1,data
如果原始数组中有 3 个具有相同 documentId 的元素,则它将被转换
到 4 个节点 -> 一个节点具有 documentid ,级别 0 ,expandable=true 和 3 个节点具有相同的 documentid,expandable=false,级别 1,data
数据将一直保持到第 1 级。
有人可以帮我解决这个问题吗?谢谢
可能不是最好的代码,但它是 one-liner - 所以总比没有行好 :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"
},
{
"documentId": "new_145_456",
"data": "new_data3"
},
{
"documentId": "new_148_4546",
"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)