【问题标题】:Create nested object from flat array从平面数组创建嵌套对象
【发布时间】:2018-04-23 15:36:35
【问题描述】:

我目前有一个对象数组,我正在尝试将其重塑为一个嵌套对象,其中ID 作为对象键,如果不是"0",则使用parent id 定位ID。我已经尝试了几种方法,但我很挣扎! 对我来说的主要绊脚石是任何超出一两层深度的东西。理想情况下,我需要它是动态的,以便它可以处理任何深度,尽管在野外我怀疑它会超过 3 层。

这是传入的对象数组:

[

  {
    ID: "1671",
    parent: "0",
  },
  {
    ID: "1223",
    parent: "0",
  },
  {
    ID: "1668",
    parent: "0",
  },
  {
    ID: "1688",
    parent: "0",
  },
  {
    ID: "1669",
    parent: "0",
  },
  {
    ID: "1681",
    parent: "1669",
  },
  {
    ID: "1680",
    parent: "1669",
  },
  {
    ID: "1670",
    parent: "1669",
  },
  {
    ID: "1682",
    parent: "1669",
  },
  {
    ID: "1433",
    parent: "1682",
  },
  {
    ID: "1684",
    parent: "1682",
  },
  {
    ID: "1672",
    parent: "1684",
  },
  {
    ID: "1685",
    parent: "1672",
  },
  {
    ID: "1686",
    parent: "1672",
  },
  {
    ID: "1683",
    parent: "0",
  },
  {
    ID: "1230",
    parent: "0",
  },
  {
    ID: "1667",
    parent: "0",
  },
  {
    ID: "1687",
    parent: "0",
  }
];

这是所需的转换:

1671: {
    ID: "1671",
    parent: "0",
  },
  1223: {
    ID: "1223",
    parent: "0",
  },
  1668: {
    ID: "1668",
    parent: "0",
  },
  1688: {
    ID: "1688",
    parent: "0",
  },
  1669: {
    ID: "1669",
    parent: "0",
    children: {
      1681: {
        ID: "1681",
        parent: "1669",
      },
      1680: {
        ID: "1680",
        parent: "1669",
      },
      1670: {
        ID: "1670",
        parent: "1669",
      },
      1682: {
        ID: "1682",
        parent: "1669",
        children: {
          1433: {
            ID: "1433",
            parent: "1682",
          },
          1684: {
            ID: "1684",
            parent: "1682",
            children: {
              1672: {
                ID: "1672",
                parent: "1684",
                children: {
                  1685: {
                    ID: "1685",
                    parent: "1672",
                  },
                  1686: {
                    ID: "1686",
                    parent: "1672",
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  1683: {
    ID: "1683",
    parent: "0",
  },
  1230: {
    ID: "1230",
    parent: "0",
  },
  1667: {
    ID: "1667",
    parent: "0",
  },
  1687: {
    ID: "1687",
    parent: "0",
  }

我的大多数失败方法一直在使用Array.reduce() 和其他类型的递归但无济于事,所以我很想看看是否有解决方案。

谢谢

【问题讨论】:

  • 请添加您的尝试/尝试。

标签: javascript arrays json object ecmascript-6


【解决方案1】:

你可以像这样使用递归函数:

function findFor(parentId) {
  // create a new object to store the result
  var z = {};

  // for each item in a
  for (var i = 0; i<a.length; i++){

    // find all children of parentId
    if (a[i].parent === parentId) {

      // recursively find children for each children of parentId
      var ch = findFor(a[i].ID);

      // if it has no children, skip adding the children prop
      var o = Object.keys(ch).length === 0 ? {} : { children: ch };
      z[a[i].ID] = Object.assign(o, a[i]);
    }
  }

  return z;
}

// find all item whose parent is "0"
console.log(findFor("0"));

var a = [
  { ID: "1671", parent: "0", },
  { ID: "1223", parent: "0", },
  { ID: "1668", parent: "0", },
  { ID: "1688", parent: "0", },
  { ID: "1669", parent: "0", },
  { ID: "1681", parent: "1669", },
  { ID: "1680", parent: "1669", },
  { ID: "1670", parent: "1669", },
  { ID: "1682", parent: "1669", },
  { ID: "1433", parent: "1682", },
  { ID: "1684", parent: "1682", },
  { ID: "1672", parent: "1684", },
  { ID: "1685", parent: "1672", },
  { ID: "1686", parent: "1672", },
  { ID: "1683", parent: "0", },
  { ID: "1230", parent: "0", },
  { ID: "1667", parent: "0", },
  { ID: "1687", parent: "0", }
];

function findFor(parentId) {
  var z = {};
  for (var i = 0; i<a.length; i++){
    if (a[i].parent === parentId) {
      var ch = findFor(a[i].ID);
      var o = Object.keys(ch).length === 0 ? {} : { children: ch };
      z[a[i].ID] = Object.assign(o, a[i]);
    }
  }
  
  return z;
}

console.log(findFor("0"));

【讨论】:

    【解决方案2】:

    尊重父母的单循环非递归方法。

    var flat = [{ ID: "1671", parent: "0" }, { ID: "1223", parent: "0" }, { ID: "1668", parent: "0" }, { ID: "1688", parent: "0" }, { ID: "1669", parent: "0" }, { ID: "1681", parent: "1669" }, { ID: "1680", parent: "1669" }, { ID: "1670", parent: "1669" }, { ID: "1682", parent: "1669" }, { ID: "1433", parent: "1682" }, { ID: "1684", parent: "1682" }, { ID: "1672", parent: "1684" }, { ID: "1685", parent: "1672" }, { ID: "1686", parent: "1672" }, { ID: "1683", parent: "0" }, { ID: "1230", parent: "0" }, { ID: "1667", parent: "0" }, { ID: "1687", parent: "0" }],
        tree = function (data, root) {
            var o = {};
            data.forEach(function(a) {
                a = Object.assign({}, a);
                if (o[a.ID] && o[a.ID].children) {
                    a.children = o[a.ID].children;
                }
                o[a.ID] = { [a.ID]: a };
                o[a.parent] = o[a.parent] || {};
                o[a.parent][a.parent] = o[a.parent][a.parent] || {};
                o[a.parent][a.parent].children = o[a.parent][a.parent].children || {};
                o[a.parent][a.parent].children[a.ID] = a;
            });
            return o[root][root].children;
        }(flat, '0');
    
    console.log(tree);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 级别不限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2019-10-06
    • 2021-03-04
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多