javascript优化成函数

时间:2018-07-30 21:56:13

标签: javascript optimization

我有两段非常相似的代码。将其简化为一个功能的最佳方法是什么?

/* 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]])
           }
        });  

1 个答案:

答案 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]])
        }
    });
}