Javascript D3.js强制布局未捕获类型错误

Javascript D3.js强制布局未捕获类型错误,javascript,d3.js,Javascript,D3.js,我目前正在尝试使用d3.js的force布局构建一个非常基本的图形。当我试图运行代码时,我遇到了一个错误:“无法读取未定义的属性‘push’”,希望有人能告诉我出了什么问题 错误发生在d3.js版本3.5.6的第6388行,该行为: neighbors[o.source.index].push(o.target); 它遇到的问题是,对象o.source不包含名为index的属性,即使该属性以前应该在force.start()函数中设置,如以下代码所示: force.start = functi

我目前正在尝试使用d3.js的force布局构建一个非常基本的图形。当我试图运行代码时,我遇到了一个错误:“无法读取未定义的属性‘push’”,希望有人能告诉我出了什么问题

错误发生在d3.js版本3.5.6的第6388行,该行为:

neighbors[o.source.index].push(o.target);
它遇到的问题是,对象o.source不包含名为index的属性,即使该属性以前应该在force.start()函数中设置,如以下代码所示:

force.start = function() {
  var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
  for (i = 0; i < n; ++i) {
    (o = nodes[i]).index = i;
    o.weight = 0;
  }
  for (i = 0; i < m; ++i) {
    o = links[i];
    if (typeof o.source == "number") o.source = nodes[o.source];
    if (typeof o.target == "number") o.target = nodes[o.target];
    ++o.source.weight;
    ++o.target.weight;
  }
  for (i = 0; i < n; ++i) {
    o = nodes[i];
    if (isNaN(o.x)) o.x = position("x", w);
    if (isNaN(o.y)) o.y = position("y", h);
    if (isNaN(o.px)) o.px = o.x;
    if (isNaN(o.py)) o.py = o.y;
  }
  distances = [];
  if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
  strengths = [];
  if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
  charges = [];
  if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
  function position(dimension, size) {
    if (!neighbors) {
      neighbors = new Array(n);
      for (j = 0; j < n; ++j) {
        neighbors[j] = [];
      }
      for (j = 0; j < m; ++j) {
        var o = links[j];
        neighbors[o.source.index].push(o.target);
        neighbors[o.target.index].push(o.source);
      }
    }
    var candidates = neighbors[i], j = -1, l = candidates.length, x;
    while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;
    return Math.random() * size;
  }
  return force.resume();
};
我的链接对象如下所示:

{
games: [...], 
id: 'some id'
}
{
source: nodeObject, 
target: nodeObject, 
weight: number
}
我的部队布局设置代码如下:

var force = d3.layout.force().charge(-1000)
  .size([500, 500])
  .nodes(nodes)
  .links(edges)
  .linkStrength(function(d) {
    return weightScale(d.weight);
  })
  .on('tick', forceTick);

d3.select('svg').selectAll('line.link')
  .data(edges, function(d) {
    return d.source.id + '-' + d.target.id;
  })
  .enter()
  .append('line')
  .attr('class', 'link')
  .style('stroke', 'black')
  .style('opacity', 0.5)
  .style('stroke-width', function(d) {
    return d.weight;
  });

var nodeEnter = d3.select('svg').selectAll('g.node')
  .data(nodes, function(d) {
    return d.id;
  })
  .enter()
  .append('g')
  .attr('class', 'node');

有人能帮我弄清楚为什么我会犯上面提到的错误吗?非常感谢您抽出时间。

您是将节点对象引用放在自己的链接源和目标属性上,还是最初将其作为索引放在节点数组中?如果是前者,请尝试使用节点索引启动数据,看看是否可以解决问题。这确实可以解决问题,但您能否告诉我,在不依赖数组位置的情况下,正确的方法是什么?这需要我再次通过我的数据,我非常想避免。非常感谢。如果你发布了你的原始代码的最低工作的例子,那么我可以看看。。。这取决于数据的绑定方式。