我有两段非常相似的代码。将其简化为一个功能的最佳方法是什么?
/* Add descendents */
var roots = g.links.reduce((obj, item) => {
obj[item.source] = obj[item.source] || [];
obj[item.source].push(item.target);
return obj;
}, {});
Object.entries(roots).forEach(
([key, value]) => {
g.nodes[key].descendents=roots[key];
for (var i in value) {
if (roots[value[i]]) g.nodes[key].descendents=roots[key].concat(roots[value[i]])
}
});
/* Add Ancestors */
var leafs = g.links.reduce((obj, item) => {
obj[item.target] = obj[item.target] || [];
obj[item.target].push(item.source);
return obj;
}, {});
Object.entries(leafs).forEach(
([key, value]) => {
g.nodes[key].ancestors=leafs[key];
for (var i in value) {
if (leafs[value[i]]) g.nodes[key].ancestors=leafs[key].concat(leafs[value[i]])
}
});
答案 0 :(得分:0)
这是一种方法:
var roots = reduceItems(g.links, "source", "target");
var leafs = reduceItems(g.links, "target", "source");
processNodes(g.nodes, roots, "descendents");
processNodes(g.nodes, leafs, "ancestors");
function reduceItems(arr, groupProp, pushProp) {
return arr.reduce((obj, item)) => {
obj[item[groupProp]] = obj[item[prop]] || [];
obj[item[groupProp]].push(item[pushProp]);
return obj;
}, {});
}
function processNodes(nodes, data, prop) {
Object.entries(data).forEach(
([key, value]) => {
nodes[key][prop]=data[key];
for (var i in value) {
if (data[value[i]]) nodes[key][prop]=data[key].concat(data[value[i]])
}
});
}