2014-06-24 53 views
0

我已經在d3.js圖表​​中有一個排序函數,奇妙地爲我的基於數字的列(切換升序/降序),但是當我把它扔到關鍵時什麼都不做對於基於文本的列d3.js:排序不工作的文本字符串

 var sortOrder = false; 
     var sortUnits = function(key) { 
      sortOrder = !sortOrder; 

      unit.sort(function(a, b) { 

        if (sortOrder) { 
         if (+a[key] > +b[key]) return -1; 
         if (+a[key] < +b[key]) return 1; 
         return 0; 
        }else{ 
         if (+a[key] > +b[key]) return 1; 
         if (+a[key] < +b[key]) return -1; 
         return 0; 
        } 
       }) 
       .transition() 
         .duration(750) 
         .delay(function(d, i) { return i * 25; }) 
         .attr('transform', function(d, i){return 'translate(0,' + (unitHeight + (i * unitHeight)) +')'; }); 
     } 

有一個簡單的修改,將允許該腳本文本和數字排序?

回答

2

因此,這裏是我是如何解決它?

  • 以字母順序排序,使用d3.ascending和d3.descending
  • 數字和文字之間進行切換,請使用isNaN()

不知道是否有一個更優雅的方式,但是這是工作:

 var sortOrder = false; 
     var sortUnits = function(key) { 

       sortOrder = !sortOrder; 

       unit.sort(function(a, b) { 

        if(isNaN(a[key])){ 
         if (sortOrder) { 
          return d3.ascending(a[key], b[key]); 
         }else{ 
          return d3.descending(a[key], b[key]); 
         } 
        }else{ 

         if (sortOrder) { 
          if (+a[key] > +b[key]) return -1; 
          if (+a[key] < +b[key]) return 1; 
          return 0; 
         }else{ 
          if (+a[key] > +b[key]) return 1; 
          if (+a[key] < +b[key]) return -1; 
          return 0; 
         } 
        } 
       }) 
       .transition() 
         .duration(750) 
         .delay(function(d, i) { return i * 25; }) 
         .attr('transform', function(d, i){return 'translate(0,' + (unitHeight + (i * unitHeight)) +')'; }); 
     } 
+0

你需要的,如果移動(sortOrder)之外的初始if?否則,很好。 –

+0

謝謝,是的,我想過...但是我可能不得不重複isNaN()。在我可以實際排序之前,我必須檢查兩件事 - sortOrder和isNaN()。我會在早上嘗試當我新鮮 – rolfsf

+1

if(isNaN(a [key])&if!sortOrder){return d3.descending(a [key],b [key])} else {return d3.ascending (a [key],b [key]);}處理頂部;可能會更快地使用elseif和其他的.. –