#javascript #d3.js #graph
#javascript #d3.js #График
Вопрос:
Я пытаюсь получить соседние узлы, используя свойство объекта в массиве. Я не могу использовать свойство индекса ссылки в массиве узлов. Мне интересно, как я могу изменить код для const a
извлечения значения? Любая помощь приветствуется!
const gData = {
nodes: [
{id: "John"},
{id: "Jack"},
{id: "Jim"}
],
links: [
{source: "John", target: "Jim"},
{source: "John", target: "Jack"},
{source: "Jack", target: "Jim"}
]
}
// cross-link node objects
gData.links.forEach(link => {
const a = gData.nodes[link.source]; // returns undefined
const b = gData.nodes[link.target];
console.log("nodes in graph data ", gData.nodes)
console.log("link", link)
console.log("link.source", link.source)
console.log("index into nodes ", gData.nodes[link.source])
!a.neighbors amp;amp; (a.neighbors = []);
!b.neighbors amp;amp; (b.neighbors = []);
a.neighbors.push(b);
b.neighbors.push(a);
!a.links amp;amp; (a.links = []);
!b.links amp;amp; (b.links = []);
a.links.push(link);
b.links.push(link);
});
Комментарии:
1. Эта первая ошибка прерывает работу всего скрипта.
link.source
не существует. У вас естьlinks
хотя2. Хорошо, возможно, вы правы. Я вернусь к этому
Ответ №1:
Проблема в том, что gData.nodes
это объект массива — его ключи «0», «1», «2», не значения id
свойств записей в массиве.
Простой способ исправить это, сократить или реструктурировать содержимое объекта — создать таблицу поиска, используя значение id в качестве индексного ключа:
gData.index = {};
gData.nodes.forEach( node => gData.index[node.id] = node);
а затем ищет узлы из их id
, где требуется:
const a = gData.index[link.source];
const b = gData.index[link.target];
Другим решением может быть написание getNodeById
метода для gData
объекта.
Синтаксические ошибки, порождаемые неопределенными значениями для a
и b
, должны разрешаться сами по себе, как только им присваиваются правильные значения узла. Очевидно, что если во время выполнения возможны ошибки, то также должен быть включен код обработки ошибок.