2013-10-10 103 views
3

我有以下數據,對象的數組:D3:使用d3.max來獲取包含對象?

var data = [ 
    { x: 0, y0: 0, y: 100 }, 
    { x: 1, y0: 0, y: 150 }, 
    { x: 2, y0: 50, y: 100 }, 
    { x: 3, y0: 50, y: 150 } 
] 

我想找到yy0,使用D3之間最大差異的對象。

我能做到這一點,以獲得最大的區別:

var max_val = d3.max(data, function(d) { return d.y - d.y0;}); 

它返回150.但我不知道該怎麼做的就是包含的對象,學習x的相應值1.

任何想法?

回答

4

你的問題是問如何使用d3.max找到這個對象,還有一個備用的想法是使用JavaScript數組的sort功能,爲你這樣做:

>>> data.sort(function(a, b){ return (b.y - b.y0) - (a.y - a.y0); })[0] 
Object {x: 1, y0: 0, y: 150} 

這裏我使用的是功能分類data那,給出兩個對象ab,使用它們的yy0屬性的差異對它們進行比較。通過從b中減去a的值,我以降序返回對象,然後獲取第一個對象。

1

我認爲目前還無法通過純D3這樣做的一個很好的方式。從d3文檔它指出:

返回給定數組中使用自然順序的最大。如果 數組爲空,則返回undefined。可以指定一個可選的訪問函數 ,這相當於在計算最大值之前調用array.map(訪問者) 。

我走進了源代碼來看看d3.max是如何計算的:

d3.max = function(array, f) { 
    var i = -1, n = array.length, a, b; 
    if (arguments.length === 1) { 
     while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined; 
     while (++i < n) if ((b = array[i]) != null && b > a) a = b; 
    } else { 
     while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined; 
     while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; 
    } 
    return a; 
    } 

這部分是由於這樣的事實,你的訪問函數返回一個值本身。你可以定製它來使它返回一個對象,但是d3.max專門處理數字。

正如其他人所說,還有其他的方式來處理這與純Javascript。

相關問題: Why is domain not using d3.max(data) in D3?