2014-02-13 175 views
5

我有一個比特的代碼,需要在列中的元素的值,並將它們放入一個數組的數組選擇最小/最大值:D3.js從陣列(嵌套d3.extent)

var someArray = new Array(rows.selectAll("td").filter(function(d,i) 
    { 
     if(i==2) //index of the cells in the rows where I retrieve the data 
     { 
      return (d3.select(this)) 
     } 
    })); 

^創建陣列[1]組成的數組具有元素中的細胞,例如「2.6」的值或「5.4」

當我嘗試使用:

console.log(d3.min(someArray)); 

我得到[數組[1],數組[1],數組[1],...],而我需要返回我(這將用於d3.scale.linear()。domain([最小值,最大值])

回答

5

您只需嵌套調用:

var min = d3.min(arrayOfArrays, function(d) { return d3.min(d); }); 

要在同一時間同時獲得最大值和最小值,使用 d3.extent()

// extent[0] == min, extent[1] == max 
var extent = d3.extent(arrayOfArrays, function(d) { return d3.extent(d); }); 

可惜你不能在嵌套情況下獲得程度 - 你必須分別做最小和最大。

+0

當我嘗試 '的console.log(d3.extent(arrayOfArrays,函數(d){返回d3.extent(d); })); ' 它返回[數組[2],數組[2]],每個包含相同的數據(在本例中爲「2.6」,最低值 – user3285806

+0

哦,對不起,你是對的,這實際上並不工作嵌套的情況,我會更新答案。 –

1

我一直在尋找一種方式來巢d3.extent,我無法找到一個,所以我使出計算出來爲我自己,這就是我想出了...

var extent = d3.extent(arrayOfArrays.reduce(function(m,d){return m.concat(d)},[])) 
1

對於的d3.extend嵌套版本,有點ES6善良和可能性有一個accessor您可以使用以下方法:

function nestedExtent(data, accessor) { 
    return data.reduce(([extentMin, extentMax], d) => { 
    const [min, max] = extent(d, accessor); 

    return [ 
     Math.min(extentMin, min), 
     Math.max(extentMax, max), 
    ]; 
    }, [Infinity, -Infinity]); 
} 
0

這是基於關閉@Johnny答案對於我們這些不夠幸運的被使用ES6:

function nestedExtent(data, accessor) { 

    return data.reduce(function (prevArr, currArr) { 
    var extentArr = d3.extent([currArr], accessor); 

    return [ 
     Math.min(prevArr[0], extentArr[0]), 
     Math.max(prevArr[1], extentArr[1]) 
    ]; 

    }, [Infinity, -Infinity]); 
} 

實施例:

var mydata = [4, 6, -2, 42, 17]; 

nestedExtent(mydata , function(d) { return d; });