2016-12-19 252 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>