以分层方式构建 JavaScript 中的数据
Structuring data in JavaScript in a hierarchical fasion
我有以下 table 个来自服务的字符串:
A6-123 A5-234 A4-345 A3-456 A2-567
A6-123 A5-234 A4-678 A3-789 A2-890
A6-123 A5-456 A4-011 A3-021 A2-015
A6-234 A5-456 A4-567 A3-678 A2-789
[{
"a": "A2-567",
"an": "NAME1",
"b": "A3-456",
"bn": "NAME2",
"c": "A4-345",
"cn": "NAME3",
"d": "A5-234",
"dn": "NAME4",
"e": "A6-123",
"en": "NAME5"
},
{
"a": "A2-890",
"an": "NAME6",
"b": "A3-789",
"bn": "NAME7",
"c": "A4-678",
"cn": "NAME8",
"d": "A5-234",
"dn": "NAME4",
"e": "A6-123",
"en": "NAME5"
}]
我想按照下面的方式构建它,这样我就可以以分层的方式显示它
root: {"A6-123", "A6-234", A6-....}
data: [
{"k":"A6-123","n":"Name5", children:{"A5-234", "A5-456"},
{"k":"A5-234","n":"Name4", children:{"A4-345", "A4-678"},
{"k":"A2-567","n":"Name1", children:{}},
... could be others }
]
我想将所有元素映射到一个层次结构中。上面的结构不是必需的,但认为那是最好的。
唯一的缺点是我必须在数据中查找下一个元素。在 java 中,我会使用 HashMap 并将 k 拉入一个键中。
正在寻找建议。
一些显示选项可能如下所示(但我不想使用想要构建功能的包):
http://ivantage.github.io/angular-ivh-treeview/
不同的是我的数据会缩进5级A6-A2。
$scope.root = [];
$scope.data = [];
$scope.loadDataToMemory = function (data) {
angular.forEach(data, function (value, key) {
if ($.inArray(value.e, $scope.root) === -1) {
$scope.root.push(value.e);
}
addToMap(value.a, value.an, "");
addToMap(value.b, value.bn, value.a);
addToMap(value.c, value.cn, value.b);
addToMap(value.d, value.dn, value.c);
addToMap(value.e, value.e, value.d);
});
}
addToMap = function (pKey, pName, pChild) {
if (!$scope.data[pKey]) {
cSet = [];
$scope.data[pKey] = { name: pName, children: cSet };
} else {
if ($.inArray(pChild, $scope.data[pKey].children) === -1) {
$scope.data[pKey].children.push(pChild);
}
}
}
要为所有节点构建树结构和散列 table,您可以迭代给定的字符串,拆分它们并为每个节点在临时对象中申请一个新对象(如果节点不存在)。
最后,你会得到一个数组,所有节点都在根和嵌套结构中。
function generateTree(array) {
var hash = {}, // reference to all nodes
tree = [], // result in tree structure
temp = { _: tree }; // collecting object
array.forEach(function (line) {
line.split(' ').reduce(function (r, k, i, kk) {
if (!r[k]) { // check if key exists
r[k] = { _: [] }; // if not create new object
hash[k] = { label: k }; // and hash
if (i + 1 !== kk.length) { // if node is not last leaf
hash[k].children = r[k]._; // generate children
}
r._.push(hash[k]); // push node to children prop
}
return r[k]; // take node with key
}, temp); // for next iteration
});
return { tree: tree, hash: hash };
}
var data = ['A6-123 A5-234 A4-345 A3-456 A2-567', 'A6-123 A5-234 A4-678 A3-789 A2-890', 'A6-123 A5-456 A4-011 A3-021 A2-015', 'A6-234 A5-456 A4-567 A3-678 A2-789'];
console.log(generateTree(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有以下 table 个来自服务的字符串:
A6-123 A5-234 A4-345 A3-456 A2-567
A6-123 A5-234 A4-678 A3-789 A2-890
A6-123 A5-456 A4-011 A3-021 A2-015
A6-234 A5-456 A4-567 A3-678 A2-789
[{
"a": "A2-567",
"an": "NAME1",
"b": "A3-456",
"bn": "NAME2",
"c": "A4-345",
"cn": "NAME3",
"d": "A5-234",
"dn": "NAME4",
"e": "A6-123",
"en": "NAME5"
},
{
"a": "A2-890",
"an": "NAME6",
"b": "A3-789",
"bn": "NAME7",
"c": "A4-678",
"cn": "NAME8",
"d": "A5-234",
"dn": "NAME4",
"e": "A6-123",
"en": "NAME5"
}]
我想按照下面的方式构建它,这样我就可以以分层的方式显示它
root: {"A6-123", "A6-234", A6-....}
data: [
{"k":"A6-123","n":"Name5", children:{"A5-234", "A5-456"},
{"k":"A5-234","n":"Name4", children:{"A4-345", "A4-678"},
{"k":"A2-567","n":"Name1", children:{}},
... could be others }
]
我想将所有元素映射到一个层次结构中。上面的结构不是必需的,但认为那是最好的。
唯一的缺点是我必须在数据中查找下一个元素。在 java 中,我会使用 HashMap 并将 k 拉入一个键中。
正在寻找建议。
一些显示选项可能如下所示(但我不想使用想要构建功能的包): http://ivantage.github.io/angular-ivh-treeview/
不同的是我的数据会缩进5级A6-A2。
$scope.root = [];
$scope.data = [];
$scope.loadDataToMemory = function (data) {
angular.forEach(data, function (value, key) {
if ($.inArray(value.e, $scope.root) === -1) {
$scope.root.push(value.e);
}
addToMap(value.a, value.an, "");
addToMap(value.b, value.bn, value.a);
addToMap(value.c, value.cn, value.b);
addToMap(value.d, value.dn, value.c);
addToMap(value.e, value.e, value.d);
});
}
addToMap = function (pKey, pName, pChild) {
if (!$scope.data[pKey]) {
cSet = [];
$scope.data[pKey] = { name: pName, children: cSet };
} else {
if ($.inArray(pChild, $scope.data[pKey].children) === -1) {
$scope.data[pKey].children.push(pChild);
}
}
}
要为所有节点构建树结构和散列 table,您可以迭代给定的字符串,拆分它们并为每个节点在临时对象中申请一个新对象(如果节点不存在)。
最后,你会得到一个数组,所有节点都在根和嵌套结构中。
function generateTree(array) {
var hash = {}, // reference to all nodes
tree = [], // result in tree structure
temp = { _: tree }; // collecting object
array.forEach(function (line) {
line.split(' ').reduce(function (r, k, i, kk) {
if (!r[k]) { // check if key exists
r[k] = { _: [] }; // if not create new object
hash[k] = { label: k }; // and hash
if (i + 1 !== kk.length) { // if node is not last leaf
hash[k].children = r[k]._; // generate children
}
r._.push(hash[k]); // push node to children prop
}
return r[k]; // take node with key
}, temp); // for next iteration
});
return { tree: tree, hash: hash };
}
var data = ['A6-123 A5-234 A4-345 A3-456 A2-567', 'A6-123 A5-234 A4-678 A3-789 A2-890', 'A6-123 A5-456 A4-011 A3-021 A2-015', 'A6-234 A5-456 A4-567 A3-678 A2-789'];
console.log(generateTree(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }