Разбор узлов по ссылкам в графе

1

У меня есть граф с ребрами, указанными в массиве ссылок. Нижеприведенная функция анализирует узлы из ссылок, но я не совсем понимаю, как это сделать. Какова цель первого предложения в инструкции OR, т.е. link.source = nodes [link.source]?

var links=[{source:"A", target:"B"}, {source:"B", target:"C"}, {source:"D", target:"E"}, {source:"E", target:"C"}];

var nodes=[];

links.forEach(function(link){
    link.source = nodes[link.source] || (nodes[link.source]={eid:link.source});
    link.target = nodes[link.target] || (nodes[link.target]={eid:link.target});
});

Я новичок в JavaScript и после нескольких попыток отладки, я все еще потерян.

  • 1
    nodes[link.source] ищет имя в объекте nodes . Ваша переменная nodes - это пустой массив, поэтому вы ничего не получаете от nodes[link.source] . Например, при первом проходе цикла links.forEach() link.source == 'A' , поэтому он ищет nodes['A'] и ничего не находит. Если бы у вас были nodes = {A:"something"} , тогда он вернул бы значение. Надеюсь, что вы попадете на правильный путь.
  • 0
    Спасибо за ваш комментарий. Я хотел спросить, какова цель наличия первого условия в условии ИЛИ (link.source = node [link.source])?
Теги:
d3.js

1 ответ

1
Лучший ответ

Похоже, вы пытаетесь создать объект nodes путем итерации по вашему массиву links, но у вас есть переменная ваших nodes установленная в пустой массив. Вместо этого вы должны установить его как пустой объект: nodes = {}. Было бы links.forEach() обернуть links.forEach() в функции, поскольку кажется, что идея будет заключаться в ее вызове несколько раз и либо вернуть значение объекта nodes (если оно было создано), либо создать его, если оно не будет но существуют. Попробуйте пример (добавлены предупреждения, чтобы вы могли увидеть результат кода):

var links = [{
      source: "A",
      target: "B"
    }, {
      source: "B",
      target: "C"
    }, {
      source: "D",
      target: "E"
    }, {
      source: "E",
      target: "C"
    }];
    
var nodes = {};
    
links.forEach(function(link) {
  link.source = nodes[link.source] || (nodes[link.source] = {
    eid: link.source
  });
  link.target = nodes[link.target] || (nodes[link.target] = {
    eid: link.target
  });
  alert(JSON.stringify(link.source));
  alert(JSON.stringify(link.target));
});
    
alert(JSON.stringify(nodes));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню