【问题标题】:JSON Hierarchical from Adjacency List来自邻接列表的 JSON 层次结构
【发布时间】:2016-05-27 03:47:12
【问题描述】:

我有邻接数据。带有 ID 和父 ID,

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

我可以正常工作,但是当我有不同的对象具有相同的 ID 但不同的父 ID 时。数据混在一起。这是我的小提琴。 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
}];

【问题讨论】:

  • 如果nodeid 不是唯一的,那么如果你有一个parentid 引用这样一个非唯一的值,你会怎么做?
  • @trincot 父 ID 是唯一的。具有父 ID 的 nodeID 应附加到该特定父 ID。

标签: javascript jquery arrays json


【解决方案1】:

解决方案是在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);
};

【讨论】:

  • 谢谢,但现在我在最后一级有重复。参考我更新的 Jfiddle。
  • 有问题的地方能不能给个id,我就不用找了?
  • "nodeid": "3402",再次感谢您迄今为止所做的一切。
  • 1396:源数据已经有这个重复,以及你在 cmets 中说的相同的 parentid (90615593) 是不可能的,所以你在输出中得到重复是正常的。
  • 你说得对,我没看到。那。应该会弄清楚的。感谢您的所有帮助。
猜你喜欢
  • 2010-10-20
  • 2018-08-20
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多