javascript - 来自邻接列表的 JSON 层次结构

标签 javascript jquery arrays json

我有邻接数据。带有 ID 和家长 ID,

我试图将其转换为带有嵌套 JSON 的分层数据。

我可以正常工作,但是当我有不同的对象时,它们具有相同的 ID,但父 ID 不同。数据变得困惑。这是我的 fiddle 。 https://jsfiddle.net/Chris1807/e6s8qom3/2/

var makeTree = (function() {
  var isArray = function(obj) {
    return Object.prototype.toString.call(obj) == "[object Array]";
  };
  var clone = function(obj) {
    return JSON.parse(JSON.stringify(obj));
  };
  var buildTree = function(catalog, structure, start) {
    return (structure[start] || []).map(function(nodeid, index) {
      var record = catalog[nodeid];
      var keys = structure[start][index];
      var children = isArray(keys) ? keys.map(function(key) {
        return buildTree(catalog, structure, key);
      }) : buildTree(catalog, structure, keys);
      if (children.length) {
        record.children = children;
      }
      return record;
    })
  };
  return function(flat) {
    var catalog = flat.reduce(function(catalog, record) {
      catalog[record.nodeid] = clone(record);
      delete(catalog[record.nodeid].parentid);
      return catalog;
    }, {});
    var structure = flat.reduce(function(tree, record) {
      (tree[record.parentid] = tree[record.parentid] || []).push(record.nodeid);
      return tree;
    }, {});
    return buildTree(catalog, structure, '#'); // this might be oversimplified.
  }
}());


var flat = [{
  nodeid: "123802475",
  parent: "#",
  parentid: "#",
  text: "CONNECTOR",
  typepart: "Component",
  icon: "glyphicon glyphicon-leaf",
  Count: 0,
  state: null
}, {
  nodeid: "123802476",
  parent: "123802475",
  parentid: "123802475",
  text: "PLATE",
  typepart: "SemiComponent",
  icon: "glyphicon glyphicon-fire",
  Count: 0,
  state: null
}, {
  nodeid: "90615593",
  parent: "123802476",
  parentid: "123802476",
  text: "C3604",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1396",
  parent: "90615593",
  parentid: "90615593",
  text: "Copper",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1762",
  parent: "90615593",
  parentid: "90615593",
  text: "Iron",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1061",
  parent: "90615593",
  parentid: "90615593",
  text: "Lead",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3281499",
  parent: "90615593",
  parentid: "90615593",
  text: "Zinc (metal)",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3402",
  parent: "90615593",
  parentid: "90615593",
  text: "Tin",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "9505195",
  parent: "123802476",
  parentid: "123802476",
  text: "e-plate Sn (electrodeposited Tin Coatings, bright and matt)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "9505195",
  parentid: "9505195",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3065",
  parent: "9505195",
  parentid: "9505195",
  text: "Sulphur",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1061",
  parent: "9505195",
  parentid: "9505195",
  text: "Lead",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3402",
  parent: "9505195",
  parentid: "9505195",
  text: "Tin",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "749088",
  parent: "123802476",
  parentid: "123802476",
  text: "e-plate Ni (bright) (electrodeposited Nickel bright)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "749088",
  parentid: "749088",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3112",
  parent: "749088",
  parentid: "749088",
  text: "Nitrogen",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3065",
  parent: "749088",
  parentid: "749088",
  text: "Sulphur",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "2619",
  parent: "749088",
  parentid: "749088",
  text: "Nickel",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "123802477",
  parent: "123802475",
  parentid: "123802475",
  text: "INSULATOR",
  typepart: "SemiComponent",
  icon: "glyphicon glyphicon-fire",
  Count: 0,
  state: null
}, {
  nodeid: "123799238",
  parent: "123802477",
  parentid: "123802477",
  text: "Polypropylene",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "238",
  parent: "123799238",
  parentid: "123799238",
  text: "Polypropylene",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "9999",
  parent: "123799238",
  parentid: "123799238",
  text: "Misc., not to declare",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "123802478",
  parent: "123802475",
  parentid: "123802475",
  text: "LOCK COVER",
  typepart: "SemiComponent",
  icon: "glyphicon glyphicon-fire",
  Count: 0,
  state: null
}, {
  nodeid: "123795153",
  parent: "123802478",
  parentid: "123802478",
  text: "Pa46-GF30",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "33167",
  parent: "123795153",
  parentid: "123795153",
  text: "Polytetramethylene adipic acid dimide",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "23374",
  parent: "123795153",
  parentid: "123795153",
  text: "GF-Fibre",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "883",
  parent: "123795153",
  parentid: "123795153",
  text: "Antimonytrioxide",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1432179",
  parent: "123795153",
  parentid: "123795153",
  text: "Brominated Epoxy",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1226985",
  parent: "123795153",
  parentid: "123795153",
  text: "Pigment portion, not to declare",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "123802479",
  parent: "123802475",
  parentid: "123802475",
  text: "CONTACT PIN",
  typepart: "SemiComponent",
  icon: "glyphicon glyphicon-fire",
  Count: 0,
  state: null
}, {
  nodeid: "90615593",
  parent: "123802479",
  parentid: "123802479",
  text: "C3604",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1396",
  parent: "90615593",
  parentid: "90615593",
  text: "Copper",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1762",
  parent: "90615593",
  parentid: "90615593",
  text: "Iron",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1061",
  parent: "90615593",
  parentid: "90615593",
  text: "Lead",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3281499",
  parent: "90615593",
  parentid: "90615593",
  text: "Zinc (metal)",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3402",
  parent: "90615593",
  parentid: "90615593",
  text: "Tin",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "749088",
  parent: "123802479",
  parentid: "123802479",
  text: "e-plate Ni (bright) (electrodeposited Nickel bright)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "749088",
  parentid: "749088",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3112",
  parent: "749088",
  parentid: "749088",
  text: "Nitrogen",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3065",
  parent: "749088",
  parentid: "749088",
  text: "Sulphur",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "2619",
  parent: "749088",
  parentid: "749088",
  text: "Nickel",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "757906",
  parent: "123802479",
  parentid: "123802479",
  text: "e-plate Au (functional) (electrodeposited functional Gold Coatings)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "757906",
  parentid: "757906",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3112",
  parent: "757906",
  parentid: "757906",
  text: "Nitrogen",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "10153",
  parent: "757906",
  parentid: "757906",
  text: "Gold",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "123802480",
  parent: "123802475",
  parentid: "123802475",
  text: "BODY",
  typepart: "SemiComponent",
  icon: "glyphicon glyphicon-fire",
  Count: 0,
  state: null
}, {
  nodeid: "73794193",
  parent: "123802480",
  parentid: "123802480",
  text: "C5191",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1396",
  parent: "73794193",
  parentid: "73794193",
  text: "Copper",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1762",
  parent: "73794193",
  parentid: "73794193",
  text: "Iron",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1061",
  parent: "73794193",
  parentid: "73794193",
  text: "Lead",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3281499",
  parent: "73794193",
  parentid: "73794193",
  text: "Zinc (metal)",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3402",
  parent: "73794193",
  parentid: "73794193",
  text: "Tin",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "2835",
  parent: "73794193",
  parentid: "73794193",
  text: "Phosphorus",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "9999",
  parent: "73794193",
  parentid: "73794193",
  text: "Misc., not to declare",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "9505195",
  parent: "123802480",
  parentid: "123802480",
  text: "e-plate Sn (electrodeposited Tin Coatings, bright and matt)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "9505195",
  parentid: "9505195",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3065",
  parent: "9505195",
  parentid: "9505195",
  text: "Sulphur",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "1061",
  parent: "9505195",
  parentid: "9505195",
  text: "Lead",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3402",
  parent: "9505195",
  parentid: "9505195",
  text: "Tin",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "749088",
  parent: "123802480",
  parentid: "123802480",
  text: "e-plate Ni (bright) (electrodeposited Nickel bright)",
  typepart: "Material",
  icon: "glyphicon glyphicon-grain",
  Count: 0,
  state: null
}, {
  nodeid: "1995",
  parent: "749088",
  parentid: "749088",
  text: "Carbon",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3112",
  parent: "749088",
  parentid: "749088",
  text: "Nitrogen",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "3065",
  parent: "749088",
  parentid: "749088",
  text: "Sulphur",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}, {
  nodeid: "2619",
  parent: "749088",
  parentid: "749088",
  text: "Nickel",
  typepart: "Substance",
  icon: "glyphicon glyphicon-asterisk",
  Count: 0,
  state: null
}];

最佳答案

解决方案是在catalog对象中使用真正的唯一键,以避免覆盖以前存储的对象。正如您所写,nodeid 值在有子项时保证是唯一的,您只需在任何 nodeid 前面添加 parentid 即可使您的 catalog 键是唯一的。

因此,只需更改三行:

  var record = catalog[start + '/' + nodeid];

和:

  catalog[record.parentid + '/' + record.nodeid] = clone(record);
  delete(catalog[record.parentid + '/' + record.nodeid].parentid);

就是这样。

作为性能改进,我建议不要使用 JSON 文本转换来复制对象,而是使用 Object.assign相反:

var clone = function(obj) {
    return Object.assign({}, obj);
};

关于javascript - 来自邻接列表的 JSON 层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468916/

相关文章:

javascript - Mongo forEach 函数只在第一行执行更新

javascript - 错误 : $injector:modulerr Module Error on running the application?

javascript - 如何在特定经纬度加载街景容器,同时点击事件获取街景?

C:从函数外部访问指针

JavaScript 双下拉菜单

javascript - 运行 VersionOne Javascript SDK 的 example.js 时发生 ETIMEOUT

C - 尝试创建一个 LinkedList 指针数组

c++ - 在 C++ 中将图像数据(R、G 和 B 像素)读入二维数组

javascript - 获取流.io : Error sharing the private key

jquery - 'this'在ajax函数中代表什么