Объединение старых данных с новыми данными

Я хочу, чтобы старые узлы в силовом макете сохранили свою позицию / импульс / фиксированность, когда я обновляю график новыми узлами.

Обновление добавляет и удаляет узлы и ссылки, но сервер только отправляет {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(), Нет необходимости указывать силовой макет использовать их явно после внесения изменений.

Другие вопросы по тегам