第一个问题,抱歉,如果我错过了一些礼仪。我正在尝试构建一个具有3个依赖关系的树,我之前已成功构建了“父,子”树,但添加第3列让我头疼。
我有一组包含3个属性的对象:
{Ref:1.1, Home: 1, City: City1}
{Ref:2.1, Home: 2, City: City2}
{Ref:1.2, Home: 1, City: City1}
{Ref:1.3, Home: 1, City: City1}
{Ref:2.2, Home: 2, City: City2}
{Ref:2.3, Home: 2, City: City2}
需要构建一个结构与此类似的树:
{City: City1, Nodes{Home: 1, Nodes{Ref: 1.1,1.2,1.3}}
{City: City2, Nodes{Home: 2, Nodes{Ref: 2.1,2.2,2.3}}
正如我所说,我可以通过使用类似于此的功能将Homes放入城市中:
function getNestedChildren(arr, parent)
{
var out = [];
for(var i=0;i<arr.length;i++) {
if(arr[i].parent == parent) {
var children = getNestedChildren(arr, arr[i].name)
if(children.length) {
arr[i].children = children
}
out.push(arr[i])
}
}
return out
}
但我不确定如何考虑树的第三个属性。提前谢谢!
答案 0 :(得分:0)
您可以使用带有组的数组来查找对象的数据,并查看组是否存在并使用它或创建新组并将其推送到级别数组。
这适用于任意数量的组。
var data = [{ Ref: '1.1', Home: '1', City: 'City1' }, { Ref: '2.1', Home: '2', City: 'City2' }, { Ref: '1.2', Home: '1', City: 'City1' }, { Ref: '1.3', Home: '1', City: 'City1' }, { Ref: '2.2', Home: '2', City: 'City2' }, { Ref: '2.3', Home: '2', City: 'City2' }];
groups = ['City', 'Home', 'Ref'],
result = [];
data.forEach(function (object) {
groups.reduce(function (level, key) {
var temp = level.find((l) => object[key] === l[key]);
if (!temp) {
temp = { [key]: object[key], nodes: [] };
level.push(temp);
}
return temp.nodes;
}, result);
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您不希望最深层次的节点数组,则只能在最后一级之前的级别使用nodes
。
var data = [{ Ref: '1.1', Home: '1', City: 'City1' }, { Ref: '2.1', Home: '2', City: 'City2' }, { Ref: '1.2', Home: '1', City: 'City1' }, { Ref: '1.3', Home: '1', City: 'City1' }, { Ref: '2.2', Home: '2', City: 'City2' }, { Ref: '2.3', Home: '2', City: 'City2' }];
groups = ['City', 'Home', 'Ref'],
result = [],
nestedGroups = groups.slice(0, -1),
last = groups.slice(-1);
data.forEach(function (object) {
nestedGroups.reduce(function (level, key) {
var temp = level.find((l) => object[key] === l[key]);
if (!temp) {
temp = { [key]: object[key], nodes: [] };
level.push(temp);
}
return temp.nodes;
}, result).push({ [last]: object[last] });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }