Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
D3.js D3-尝试基于元素名称而不是值进行嵌套_D3.js - Fatal编程技术网

D3.js D3-尝试基于元素名称而不是值进行嵌套

D3.js D3-尝试基于元素名称而不是值进行嵌套,d3.js,D3.js,我不确定这是否可行,但我正在尝试创建一个d3.nest对象,其键是一个元素名,而不是该元素的值。这将用于堆叠面积图中 以下是示例原始数据: { "_id" : { "month" : 2, "day" : 26, "year" : 2014 }, "total" : 34492, "failed" : 1, "skippe

我不确定这是否可行,但我正在尝试创建一个d3.nest对象,其键是一个元素名,而不是该元素的值。这将用于堆叠面积图中

以下是示例原始数据:

{
        "_id" : {
                "month" : 2,
                "day" : 26,
                "year" : 2014
        },
        "total" : 34492,
        "failed" : 1,
        "skipped" : 0
}
我想基于总的、失败的和跳过的元素名称,而不是它们的值(即:不是数字),创建一个嵌套对象

生成的嵌套对象类似于:

[
    {
        key: "total",
        values: [
            {
                "date": "2014-02-26T05:00:00.000Z",
                "count": 34492
            },
            {
                "date": "2014-02-27T05:00:00.000Z",
                "count": 34495
            } 
        ]
    },
    {
        key: "failed",
        values: [
            {
                "date": "2014-02-26T05:00:00.000Z",
                "count": 1
            },
            {
                "date": "2014-02-27T05:00:00.000Z",
                "count": 0
            } 
        ]
    }
]
我对原始数据的布局有一些控制,因此我尝试在状态对象下添加总计、失败和跳过的元素,但这也不起作用

以下是我正在使用的一些代码:

data.result.forEach(function(d) {
    d.date = new Date(d._id.year, d._id.month-1, d._id.day);
    d.status = {
        "total": d.total,
        "failed": d.failed,
        "skipped": d.skipped
    };
});

var nested = d3.nest()
    .key(function(d) { return d.status; })
    //.key(function(d) { return d.total; })
    //.key(function(d) { return d.failed; })
    //.key(function(d) { return d.skipped; })
    .entries(data.result);

谢谢您的帮助。

这不是d3.nest的工作,但肯定可以完成

如果要根据分组变量(或多个嵌套组)将长数组拆分为多个子数组,则使用嵌套函数。原始数组中的每个元素仅显示在一个子数组中

您希望将相同的数据对象数组重复三次,每次提取不同的值

从原始步骤开始解析日期值:

data.result.forEach(function(d) {
    d.date = new Date(d._id.year, d._id.month-1, d._id.day);
});
然后创建一个包含不同状态类型的数组,这些状态类型可以作为单独的数据系列。您可以通过查看对象键从数据创建此数组,但我在这里假设您知道选项应该是什么:

var statusTypes = ["total", "failed", "skipped"];
然后使用嵌套

  • statusTypes
    数组中的每个值创建一个新数组,该数组由单独的数据系列组成;及
  • 对于每个数据系列,创建包含适当计数值的数据数组版本
  • 像这样:

    var dataSeries = statusTypes.map( function(type) {
    
              //for each type, create a mapped version of the data array
              return data.result.map( function(d) {
    
                          //for each entry in the data array,
                          //create a new data object based on the 
                          //specific type of count
                          return { date: d.date,
                                   count: d[type]
                                 };
                     } );
    
        });
    

    您是否可以使用它生成一个更嵌套的结构,如下所示:var layers=[{“name”:“total”,“values”:[{“date”:Sun Mar 02 2014 00:00:00 GMT-0500(东部标准时间),“count”:91},{“date”:Mon Mar 03 2014 00:00:00 GMT-0500(东部标准时间),“count”:290}];我正在玩弄它,但我以前从未使用过map。
    map
    只是创建一个新数组,其中每个元素都是在原始数组的相应元素上运行函数的结果。如果希望每个元素都是一个对象,而不仅仅是子数组,那么只需确保这是从外部映射函数返回的内容:
    function(type){var o={};o.name=type;o.values=/*内部映射函数*/;return o;}