javascript - 将多维数组转换为树状结构

标签 javascript arrays multidimensional-array

我有一个如下所示的多维数组:

[
    {"primary":{"sub":{"ID":[]}}},
    {"primary":{"sub":{"Name":[]}}},
    {"primary":{"ID":[]}},
    {"primary":{"Name":[]}}
]

我想获取独特的属性并将它们排序到具有以下结构的树中:

primary
   sub
      ID
      Name
   ID
   Name

我尝试了很多事情,最新的是:

function multiDimensionalUnique(arr) {
    var uniques = [];
    var itemsFound = {};
    for (var i = 0, l = arr.length; i < l; i++) {
      var stringified = JSON.stringify(arr[i]);
      if (itemsFound[stringified]) {
        continue;
      }
      uniques.push(arr[i]);
      itemsFound[stringified] = true;
    }
    return uniques;
}

uniqueCols = multiDimensionalUnique(arrayCols);

但这没有用。

我还研究了分组函数和reduce(我无法理解它),但到目前为止还没有解决它。

需要注意的是,属性都是动态的,结构可能非常复杂,我不知道我事先会得到什么数据,只是它会像上面的代码(非常简化) .

最佳答案

递归调用的函数dive()可以完成这项工作,请参见此处:

var inp=[{"primary":{"sub":{"ID":[1,2,3]}}},
    {"primary":{"sub":{"Name":[4,5,6]}}},
    {"primary":{"ID":[7,8,9]}},
    {"primary":{"Name":[5,5,5]}}];
var tree={};


function dive(tree,obj){
  for (var p in obj) {
    if (!tree[p]) tree[p]=obj[p];
    else     dive(tree[p],obj[p]);
  }
}

inp.forEach((el)=>dive(tree,el));

console.log(tree);

我冒昧地用一些内容增强你的空数组。当然,它对于空数组也同样有效。

结果:

{
  "primary": {
    "sub": {
      "ID": [
        1,
        2,
        3
      ],
      "Name": [
        4,
        5,
        6
      ]
    },
    "ID": [
      7,
      8,
      9
    ],
    "Name": [
      5,
      5,
      5
    ]
  }
}

关于javascript - 将多维数组转换为树状结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51672243/

相关文章:

javascript - Google Sheets 应用程序脚本 Indexof

c - 检查二维数组中不连续分组的更好算法

javascript - 在部分 View 中保留滚动事件

javascript - ie clientWidth offsetWidth 和 jQuery 都错了

java - 如何计算归并排序中的比较次数?

ios - 使用 AlamofireObjectMapper 将对象 json 数据映射到 2 个单独的数组中

php - 使用 PHP 数组返回 CSS 代码

Javascript 定时器不同步

javascript - 我正在尝试将选择选项值与常数相乘

javascript - Laravel 5.5 - 从 JSON 对象数组为数据表创建列标题