将旧数据与新数据合并

时间:2013-12-01 21:44:20

标签: json d3.js force-layout

当我用新节点更新图形时,我希望力布局中的旧节点保持其位置/动量/固定性。

更新添加和删除节点和链接,但服务器仅发送{name: _},但不知道其余内容,即{x: _, y: _, px: _, py: _, fixed: _}

现在,我手动合并每个:

var names = {};
// stores old nodes, indexed by _.name

function merge(nodes) {
    for (var i=0; i < nodes.length; i++) {

        var next = nodes[i];
        var prev = names[nodes[i].name]; // defaults to null
        var node = $.extend(true, {}, next, prev); // merge old into new
        nodes[i] = node;

        names[node.name] = node;
    }
    return nodes;
}

d3.json(function(error, graph){
    merge(graph.nodes)
    force.nodes(graph.nodes);
    ...
}

有更好的方法吗?也许某些d3函数接受两个数据(即旧的和新的)并输出一个(用作新的),这是由数据连接调用的? selection.data()仅需key

example替换节点,而不是合并它们。

相关:Problems adding and removing nodes in a force-layout using d3.js

1 个答案:

答案 0 :(得分:1)

D3没有提供任何功能来执行您正在寻找的内容,但您已经实现了merge,它执行相同的操作。基本上,您需要修改您为force.links()force.nodes()提供的数据结构。在进行更改后,无需告诉强制布局明确使用它们。