如何使用Javascript / Typescript为Angular树的Flat Array创建数据

问题描述

我有以下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)