【问题标题】:nested arrays in d3.jsd3.js 中的嵌套数组
【发布时间】:2026-01-02 07:00:02
【问题描述】:

我看到了有关在 d3.js 中处理“嵌套 json”的问题,并且看到建议的解决方案主要是“扁平化”数据(意味着创建一个新变量并将数据推送到所需的级别) 这里举两个例子:

我的问题是:可以使用各种数组函数之一来访问数据级别而不创建新变量吗? Handling arrays

我有一个看起来像这样的数组:

var dataset = 
 {"directed": false, 
  "graph": [], 
  "nodes": 
 [
 {"Region": "X15", "Group": "EU", "id": "BE"}, 
{"id": "FR"}, 
{"id": "BG"}, 
{"id": "DK"}, 
{"id": "HR"}, 
{"id": "DE"}
], 
"links": 
 [
 {"source": 0, "target": 0, "weight": 0}, 
 {"source": 0, "target": 1, "weight": 130}, 
 {"source": 0, "target": 2, "weight": 1}, 
 {"source": 0, "target": 3, "weight": 36}, 
 {"source": 0, "target": 4, "weight": 4}, 
 {"source": 0, "target": 5, "weight": 117}
 ], 
 "multigraph": false}

我已经尝试了以下

并且我想访问权重(使用 d3.max 计算其最大值)

dataset.links // gives me link 
dataset.links[0].weight // gives me the weight of first but can't get the index to work

当使用数组函数时,我无法获得低于该值的元素

 d3.entries(dataset)
 d3.values(dataset.links)

我错过了什么?

我希望这个问题是有意义的。

P.S:如果必须展平数组,在 javascript 中这样做有什么好处,或者如果我创建数组(例如在 python 中)并将其传递给 javascript 是否相同

【问题讨论】:

  • 数据集不是一个数组,它是一个对象。数组操作对它不起作用。你在底部做的是把它变成一个数组,但我不确定你想用它做什么。
  • 谢谢。我现在看到了区别。我只想访问权重,例如计算其最大值。知道我该怎么做吗?

标签: javascript json d3.js


【解决方案1】:

再次阅读您的帖子后,我想我知道您要做什么了。

如果您想使用d3.max 之类的内容访问权重列,您可以使用访问器函数。

访问器函数指定如何查看数组中的项目。在您的情况下,您需要一个查看dataset.links 中每个链接中的weight 字段的函数。将链接作为输入,这个函数非常简单:

function getWeight(link){return link.weight}

然后我们可以使用这个函数作为访问函数来获取dataset.linksweight字段的最大值,如下:

var maxWeight = d3.max(dataset.links, getWeight)

这使用d3.max 命令的一般形式d3.max(array [,accessorFcn])

我已经设置了一个 fiddle 来执行此操作,然后提醒最大重量。

【讨论】:

  • 这太棒了。非常感谢
  • 如何使用该函数检索权重的实际值(例如在另一个变量中?)
  • 这取决于变量的结构。比如links给出了一堆变量的ID,而权重在某个ID对应的数据库中,你可以创建一个访问器函数在数据库中查找ID,然后获取与ID。