Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.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
Javascript 具有非标准化数据的NVD3多柱状图堆叠显示_Javascript_Jquery_D3.js_Nvd3.js - Fatal编程技术网

Javascript 具有非标准化数据的NVD3多柱状图堆叠显示

Javascript 具有非标准化数据的NVD3多柱状图堆叠显示,javascript,jquery,d3.js,nvd3.js,Javascript,Jquery,D3.js,Nvd3.js,我有多个数据集要传递给NVD3多条形图。问题是,如果一个集合与另一个集合中缺少某些属性,则图表在堆叠模式下似乎无法正确显示 假设我有一个用户每周饮酒偏好的列表: [ { userName: "Todd", values: [ { x: "Coffee", y: 32 }, { x: "Te

我有多个数据集要传递给NVD3多条形图。问题是,如果一个集合与另一个集合中缺少某些属性,则图表在堆叠模式下似乎无法正确显示

假设我有一个用户每周饮酒偏好的列表:

[
    {
        userName: "Todd",
        values: [
            { 
                x: "Coffee",
                y: 32
            },
            {
                x: "Tea",
                y: 13
            },
            {
                x: "Beer",
                y: 2
            }
        ]
    },
    {
        userName: "Allison",
        values: [
            { 
                x: "Coffee",
                y: 4
            },
            {
                x: "Milk",
                y: 2
            },
            {
                x: "Sprite",
                y: 14
            }
        ]
    },
    {
        userName: "Vern",
        values: [
            { 
                x: "Water",
                y: 112
            },
            {
                x: "Gatorade",
                y: 13
            },
            {
                x: "Beer",
                y: 0
            }
        ]
    }
]
由于并非所有“用户”都有相同的饮料,因此在堆栈模式下,图形将无法正确显示

如果我对数据进行规范化,以便每个用户都能喝到相同的饮料,而之前缺少的值得到一个
0
值,则堆叠模式将正确显示

我正在寻找一种以编程方式规范化数据的方法,以便所有“用户”数组都具有相同的对象计数


这与此处的帖子类似:,但是,我正在寻找一种以编程方式规范化数据的方法。

这不是最有效的方法,但不使用任何库,对于不太大的数据量应该可以正常工作:

var drinks = [];
data.forEach(function(d) {
  d.values.forEach(function(e) {
    if(drinks.indexOf(e.x) == -1) drinks.push(e.x);;
  });
});

data.forEach(function(d) {
  drinks.forEach(function(drink) {
    var have = false;
    d.values.forEach(function(e) {
        if(e.x == drink) have = true;
    });
    if(!have) d.values.push({x: drink, y: 0});
  });
});
完成演示