首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D3堆栈()与嵌套对象

D3堆栈()与嵌套对象
EN

Stack Overflow用户
提问于 2017-02-04 10:54:22
回答 1查看 4.3K关注 0票数 2

当我试图使用D3v4实现一个规范化的堆叠条形图时,我遇到了一个问题。

这个问题的出现是因为我的数据格式包含在服务器端动态填充的嵌套对象数组。

代码语言:javascript
复制
var data = [{x:"data1", y:[{name:"red", value:10}, {name:"green", value:20}]},
            {x:"data2", y:[{name:"red", value:30}, {name:"green", value:5}]}];

对此调用d3.stack()将无法工作,因为d3不知道如何遍历对象数组y。(https://jsfiddle.net/xv1qgqjg/)

有没有办法告诉d3.stack()在哪里可以找到类似于其他地方使用的.data(function(d){ return d.y; })的相关数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 12:07:39

似乎是不可能的。根据有关堆栈的文档(数据、参数…),

任何附加参数都是任意的;它们与此对象一起传播到访问器。

因此,您必须更改数据,创建一个可以传递给d3.stack()的数组,如下所示:

代码语言:javascript
复制
[{red:10,green:20},
{red:30,green:5}]

考虑到问题中的数据数组,有几种方法可以创建上述数组。下面是我的解决方案(新的数组名为newData):

代码语言:javascript
复制
newData = [];

data.forEach(d => {
    var tempObj = {}
    d.y.forEach(e => {
        tempObj[e.name] = e.value;
    })
    newData.push(tempObj);
});

下面是一个演示:

代码语言:javascript
复制
var data = [{x:"data1", y:[{name:"red", value:10}, {name:"green", value:20}]},
            {x:"data2", y:[{name:"red", value:30}, {name:"green", value:5}]}];

newData = [];

data.forEach(d => {
    var tempObj = {}
    d.y.forEach(e => {
        tempObj[e.name] = e.value;
    })
    newData.push(tempObj);
});

var stack = d3.stack()
    .keys(["red", "green"])
    .order(d3.stackOrderNone)
    .offset(d3.stackOffsetExpand);

var series = stack(newData);
console.dir(series);
代码语言:javascript
复制
<script src="https://d3js.org/d3.v4.min.js"></script>

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42039506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档