Javascript возвращает undefined при индексации в массив с использованием свойства объекта

#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 , должны разрешаться сами по себе, как только им присваиваются правильные значения узла. Очевидно, что если во время выполнения возможны ошибки, то также должен быть включен код обработки ошибок.