2012-07-06 7 views
17

Próbowałem ustawienie obu węzłów i łączy jednocześnie w ten sposób:d3.js: „nie można odczytać własności«ciężar»undefined” podczas ręcznego definiowania oba węzły i łącza dla układu sił

var force = d3.layout.force() 
    .size([w, h]) 
    .nodes(nodes) 
    .links(connections) 
    .start(); 

nodes = [{"name":"data_base_id", "kind":"subgenre"},...] 
connections = [{"source":"name_of_node", "target":"name_of_other_node"},...] 

mam dane, które mogą nie mieć połączeń, więc konieczne jest zdefiniowanie węzłów, tak aby wszystkie węzły były renderowane. A definiowanie gatunków jest dość łatwe. , ale pojawia się ten błąd;

Cannot read property 'weight' of undefined 

I kiedy wykomentuj .links (połączenia) wykres renderuje (wystaje pęczek punktów rozsianych po całym ...) W jaki sposób mogę uzyskać połączenia/linki do współpracy z D3?

Czytałem dokumenty i najwyraźniej źródłem i celem muszą być INDEKS węzłów w tablicy węzłów. Czy mimo to można to zmienić? Czy mogę użyć nazwy węzła zamiast indeksu w tablicy?

Odpowiedz

8

Układ ukierunkowany na siłę wykorzystuje grubość krawędzi do obliczenia układu. Spróbuj dodać manekina "weight":1 do wszystkich swoich połączeń.

Kod, który inicjuje powiązania wygląda następująco:

links.forEach(function(d) { 
    if (typeof d.source == "number") { d.source = nodes[d.source]; } 
    if (typeof d.target == "number") { d.target = nodes[d.target]; } 
}); 

Przypuszczalnie można podkręcić, że (w źródle D3) do korzystania z nieruchomości/typ.

4

Myślę, że możesz mieć wartości null w swoim źródle i celu. Miałem też ten błąd i naprawiłem go, odfiltrowując wartości null.

16

Zetknęłam się z tym samym problemem wcześniej, ponieważ wynika to z wartości null w źródle/celu linków. wydrukować węzły and Links informacje mogą pomóc debugować

1

miałem ten problem pojawi się w wielu aspektach. Ostatnio miałem moją listę krawędzi następująco:

{Source: 0; Target: 1} 

zamiast:

{source: 0, target: 1} 
10

Oprócz odpowiedzi wymieniających null w źródle/target linków, powodem tego może być przypisanie źródła/celu spoza zakresu. Na przykład. masz 10 węzłów i przypisujesz cel, aby był 11-tym indeksowanym węzłem.

+0

mam ten problem, jak mogę iść o nie rzucanie błąd, jeśli nie mogę znaleźć węzeł w moich danych? – thatOneGuy

+0

jak @air_bob powiedział, możesz wydrukować, jeśli jakieś przypisania linków przekraczają liczbę węzłów. – elachell

+0

Ważna uwaga: JavaScript jest zindeksowany. Tak więc uważam, że właściwym komentarzem jest ".. masz 10 węzłów i przypisujesz cel (lub źródło), aby był 10 indeksowanym węzłem" – JHowIX

9

Dzięki powyższym odpowiedziom odnoszą się do zerowych wartości źródłowych lub docelowych!

Testowałem wykres od http://bl.ocks.org/mbostock/4062045 i odkryłem, że moje dane odnoszą się do brakującego węzła.

Może to pomóc innym debugować ten problem:

d3.json("my-buggy-data.json", function(error, graph) { 

    // Find blank links, which give the error 
    // "Uncaught TypeError: Cannot read property 'weight' of undefined" 
    graph.links.forEach(function(link, index, list) { 
     if (typeof graph.nodes[link.source] === 'undefined') { 
      console.log('undefined source', link); 
     } 
     if (typeof graph.nodes[link.target] === 'undefined') { 
      console.log('undefined target', link); 
     } 
    }); 

    force 
     .nodes(graph.nodes) 
     .links(graph.links) 
     .start(); 
+1

To rozwiązuje mój problem, dzięki! –

Powiązane problemy