使用d3js排序数组数组

时间:2016-12-19 23:40:30

标签: arrays sorting d3.js

我有一个数组,其中数组中的每个元素(代表最高法院首席大法官)都包含一系列数据点(首席大法官的姓名,争议数量和年份)。

对于顶级数组中的每个元素,我需要按年份按升序对较低级别数组进行排序。

我尝试使用以下方法按升序排序年份:

  nested_data.forEach(function(d) {
    d.values.sort(d3.ascending(d.values.year));
  });

但是它并没有按年份按升序对低级数组进行排序。

以下是我的嵌套数据的console.log以显示其结构。

Array[5]
  0:Object
    key:"Vinson"
    values:Array[7]
      0:Object
        chief:"Vinson"
        disputes:142
        year:Tue Jan 01 1946 00:00:00 GMT+0800 (CST)
      1:Object
      2:Object
      3:Object
      4:Object
      5:Object
      6:Object
  1:Object
    key:"Warren"
    values:Array[16]
  2:Object
    key:"Burger"
    values:Array[17]
  3:Object
    key:"Rehnquist"
    values:Array[19]
  4:Object
    key:"Roberts"
    values:Array[11]

如何按年份按升序对较低级别数组进行排序?

1 个答案:

答案 0 :(得分:2)

这是功能:

nested_data.forEach(function(d) {
    d.values.sort(function(a, b) {
        return d3.ascending(+a.year, +b.year)
    });
});

您的原始功能有两个问题:

  1. 由于您要对values数组进行排序,因此无需在values
  2. 中重复compareFunction
  3. 指定后,compareFunction使用两个参数,通常名为ab。您必须将d3.ascending放在compareFunction内。看看here
  4. 这是一个虚假数据的演示:

    var data = [{
            key: "foo",
            values: [{
                chief: "Bob",
                year: 1982
            }, {
                chief: "Tom",
                year: 1977
            }, {
                chief: "Carla",
                year: 2010
            }, {
                chief: "Ana",
                year: 1999
            }]
        }, {
            key: "bar",
            values: [{
                chief: "Bill",
                year: 2009
            }, {
                chief: "Ted",
                year: 2014
            }]
        }, {
            key: "baz",
            values: [{
                chief: "Fred",
                year: 1998
            }, {
                chief: "Su",
                year: 1992
            }, {
                chief: "Charlie",
                year: 1999
            }, {
                chief: "Alice",
                year: 1979
            }]
        }, ];
    
        data.forEach(function(d) {
            d.values.sort(function(a, b) {
                return d3.ascending(+a.year, +b.year)
            });
        });
    
        console.log(data);
    <script src="https://d3js.org/d3.v4.min.js"></script>