【问题标题】:Find the most recent date and output value by group按组查找最近的日期和输出值
【发布时间】:2018-07-20 18:14:09
【问题描述】:

我只想显示每个组的最新值。

以下 CSV 示例:肉桂葡萄干品种的百吉饼总量是在三个不同的采样期收集的:2017 年 5 月、2017 年 3 月和 2016 年 11 月,它们的数量分别为:300、100 和 20。

我已经获取了年份和月份,将它们组合起来,并将它们转换为数字格式,这样我就可以执行 d3.max 来定位最近(最高)的值。最高的是 42856(2017 年 5 月),但我想显示金额(300)而不是 d3.max 金额。

breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
Bagel,Yes,Blueberry,February,2017,42767,50
Bagel,Yes,Blueberry,November,2016,42675,30
Bagel,Yes,Blueberry,March,2016,42430,100
Bagel,Yes,Plain,February,2018,43132,200
Bagel,Yes,Plain,December,2017,43070,202
Bagel,Yes,Plain,February,2016,42401,201

这是我的 Javascript:

d3.csv("Breakfast.csv",function(data) {
        data.forEach(function(d){
            d.value = +d.value;
            d.year = +d.year;
            d.dateCode = +d.dateCode;
        });

        var breakfastCombinations = d3.nest()
        .key(function(d) {return d.breakfastItem; })
        .key(function(d) {return d.breakfastItemType; })
        .rollup(function(oldestDate) { 
            return d3.max(oldestDate, function(d) {
                return d.dateCode; });
            })
        .entries(data);
        document.getElementById("breakfastjson").innerHTML = JSON.stringify(breakfastCombinations,false,2); 

    });

将我的 JSON 弹出为

 {
    "key": "Bagel",
    "values": [
      {
        "key": "Cinnamon Raisin",
        "value": 42856
      },
      {
        "key": "Blueberry",
        "value": 42767
      },
      {
        "key": "Plain",
        "value": 43132
      }
    ]
  }

但我希望“价值”是该类型百吉饼的总量,而不是 dateCode。像这样:

  {
    "key": "Bagel",
    "values": [
      {
        "key": "Cinnamon Raisin",
        "value": 300
      },
      {
        "key": "Blueberry",
        "value": 50
      },
      {
        "key": "Plain",
        "value": 200
      }
    ]
  }

我想使用此 dateCode 来识别要显示的许多不同信息(如月、年等)的信息。我试过这样的组合:

        .rollup(function(oldestDate) { 
        return d3.max(oldestDate, function(d) {
            return d.dateCode; }).value;
        })

        .rollup(function(oldestDate) { 
        return d3.max(oldestDate, function(d) {
            return d.dateCode.value; });
        })

但我似乎找不到正确的语法来显示它。救命!

【问题讨论】:

    标签: javascript html json d3.js


    【解决方案1】:

    你只需要对对象数组oldestDate进行排序,得到第一个的value属性,它是最高的:

    .rollup(function(oldestDate) {
        return oldestDate.sort(function(a, b) {
            return b.dateCode - a.dateCode
        })[0].value
    });
    

    这里是演示:

    var csv = `breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
    Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
    Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
    Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
    Bagel,Yes,Blueberry,February,2017,42767,50
    Bagel,Yes,Blueberry,November,2016,42675,30
    Bagel,Yes,Blueberry,March,2016,42430,100
    Bagel,Yes,Plain,February,2018,43132,200
    Bagel,Yes,Plain,December,2017,43070,202
    Bagel,Yes,Plain,February,2016,42401,201`;
    
    var data = d3.csvParse(csv, function(d) {
      d.value = +d.value;
      d.year = +d.year;
      d.dateCode = +d.dateCode;
      return d;
    });
    
    var breakfastCombinations = d3.nest()
      .key(function(d) {
        return d.breakfastItem;
      })
      .key(function(d) {
        return d.breakfastItemType;
      })
      .rollup(function(oldestDate) {
        return oldestDate.sort(function(a, b) {
          return b.dateCode - a.dateCode
        })[0].value
      })
      .entries(data);
    
    console.log(breakfastCombinations)
    <script src="https://d3js.org/d3.v4.min.js"></script>

    【讨论】:

    • 效果很好,这正是我所需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多