Javascript powerbi中d3.js的父json树和子json树

Javascript powerbi中d3.js的父json树和子json树,javascript,Javascript,我现在正在使用power bi D3.js visual构建客户可视化。 power bi中的D3将以下JSON作为输入: var arr = [ { "source" : "BBB", "target" : "AAA"}, { "source" : "CCC ", "target" : "BBB"}, { "source" : "DDDD", "target" : "AAA"}, { "source" : "SSSS", "target" : "CCC"}, { "source" : "EE

我现在正在使用power bi D3.js visual构建客户可视化。 power bi中的D3将以下JSON作为输入:

 var arr = [
{ "source" : "BBB", "target" : "AAA"},
{ "source" : "CCC ", "target" : "BBB"},
{ "source" : "DDDD", "target" : "AAA"},
{ "source" : "SSSS", "target" : "CCC"},
{ "source" : "EEEE", "target" : "BBB"},
{ "source" : "FFFF", "target" : "DDDD"},
但我需要的是:

var arr = 

{
  "source": "AAA",
  "children": [
    { 
      "source": "BBB",
      "children": [
        { "source": "CCC",
           "children": [
               { "source": "SSSS"] },
        { "source": "EEEE" }
      ]
    },
    { "source": "DDDD",
      "children": [
        { "source": "FFFF" },
     ] },

  ]
}
有人能帮助一个人在javascript中获得这种格式吗

我厌倦了在其他帖子上找到的剧本,我已经做了一些小改动,只是不能开始工作

function unflatten(arr) {
  var tree = [],
      mappedArr = {},
      arrElem,
      mappedElem;

  // First map the nodes of the array to an object -> create a hash table.
  for(var i = 0, len = arr.length; i < len; i++) {
    arrElem = arr[i];
    mappedArr[arrElem.child] = arrElem;
    mappedArr[arrElem.child]['children'] = [];
  }



  for (var id in mappedArr) {
    if (mappedArr.hasOwnProperty(id)) {
    console.log(mappedArr.hasOwnProperty(id))
      mappedElem = mappedArr[id];
      //console.log(mappedElem)
      // If the element is not at the root level, add it to its parent array of children.
      if (mappedElem.parent!="0") {
        mappedArr[mappedElem['parent']]['children'].push(mappedElem);
      }
      // If the element is at the root level, add it to first level elements array.
      else {
        tree.push(mappedElem);
      }
    }
  }
  return tree;
}
功能取消平台(arr){
var-tree=[],
mappedArr={},
阿瑞勒姆,
mappedElem;
//首先将数组的节点映射到对象->创建哈希表。
对于(变量i=0,len=arr.length;i
解决这个问题的方法有很多,这里只有一种:

const arr=[
{来源:“BBB”,目标:“AAA”},
{来源:“CCC”,目标:“BBB”},
{来源:“DDDD”,目标:“AAA”},
{来源:“SSSS”,目标:“CCC”},
{来源:“EEEE”,目标:“BBB”},
{来源:“FFFF”,目标:“DDDD”}
];
const trunk=arr.find(x=>!arr.some(y=>y.source==x.target)).target;
常量分支=arr.reduce((acc,x)=>{
acc[x.target]=acc[x.target]| |[];
acc[x.target]。推送(x.source);
返回acc;
}, {});
const tree=构建树(主干、分支);
函数构建树(源、分支){
常量树={source};
if(分支[源]){
tree.children=branchs[source].map(x=>buildTree(x,branchs));
}
回归树;
}
日志(“Trunk:,Trunk”);
console.log(“分支:”,分支);

log(“输出:”,JSON.stringify(tree,null,2))解决这个问题的方法有很多,这里只有一种:

const arr=[
{来源:“BBB”,目标:“AAA”},
{来源:“CCC”,目标:“BBB”},
{来源:“DDDD”,目标:“AAA”},
{来源:“SSSS”,目标:“CCC”},
{来源:“EEEE”,目标:“BBB”},
{来源:“FFFF”,目标:“DDDD”}
];
const trunk=arr.find(x=>!arr.some(y=>y.source==x.target)).target;
常量分支=arr.reduce((acc,x)=>{
acc[x.target]=acc[x.target]| |[];
acc[x.target]。推送(x.source);
返回acc;
}, {});
const tree=构建树(主干、分支);
函数构建树(源、分支){
常量树={source};
if(分支[源]){
tree.children=branchs[source].map(x=>buildTree(x,branchs));
}
回归树;
}
日志(“Trunk:,Trunk”);
console.log(“分支:”,分支);

log(“输出:”,JSON.stringify(tree,null,2))!arr.some(y=>y.source==x.target)).target;再次感谢您帮助我,以及在有多个中继的情况下会发生什么我用“进一步澄清”编辑了答案,并为多个中继的情况添加了一个代码段我做了一些更改以满足我的额外要求,但它非常有效。很好的解决方案。谢谢您再次光临,只是想知道有什么方法可以为它添加属性。例如,它可能对每个都有描述,并且描述是源的属性。谢谢你好,我对js很陌生。只是想知道你能否解释一下这行代码:consttrunk=arr.find(x=>!arr.some(y=>y.source==x.target)).target;再次感谢您帮助我,以及在有多个中继的情况下会发生什么我用“进一步澄清”编辑了答案,并为多个中继的情况添加了一个代码段我做了一些更改以满足我的额外要求,但它非常有效。很好的解决方案。谢谢您再次光临,只是想知道有什么方法可以为它添加属性。例如,它可能对每个都有描述,并且描述是源的属性。非常感谢。