Объединение старых данных с новыми данными
Я хочу, чтобы старые узлы в силовом макете сохранили свою позицию / импульс / фиксированность, когда я обновляю график новыми узлами.
Обновление добавляет и удаляет узлы и ссылки, но сервер только отправляет {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
,
Этот пример заменяет узлы, а не объединяет их.
Связанные: Проблемы с добавлением и удалением узлов в силовом макете с использованием d3.js
1 ответ
D3 не предоставляет никаких функций для того, что вы ищете, но вы уже реализовали merge
, который делает то же самое. По сути, вам нужно изменить структуры данных, которые вы дали force.links()
а также force.nodes()
, Нет необходимости указывать силовой макет использовать их явно после внесения изменений.