2016-12-19 201 views
1

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

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

我试图利用升序进行排序一年以下几点:

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] 

我怎么能逐年递增顺序较低级别的数组进行排序?

回答

2

这是函数:

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

你原有的功能有两个问题:

  1. 既然你排序values阵列,则不需要重复valuescompareFunction
  2. 指定时,compareFunction使用两个参数,通常名称为ab。您必须将d3.ascending放在compareFunction之内。看看here

这里是一个假的数据演示:

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>