D3.js从数组数组中选择最小/最大值(嵌套d3.extent)

时间:2014-02-13 17:53:52

标签: javascript arrays d3.js

我有一些代码可以获取列中元素的值并将它们放入数组中:

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)); 

我得到[Array [1],Array [1],Array [1],...]而我需要返回的是那些数组中最低的,然后是最大的值(这将在d3.scale中使用) .linear()。domain([最小值,最大值])

5 个答案:

答案 0 :(得分: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); });

<击>

不幸的是,你无法在嵌套的情况下获得范围 - 你必须分别做min和max。

答案 1 :(得分:3)

对于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]);
}

答案 2 :(得分:1)

我正在寻找一种方法来筑巢d3.extent而我无法找到它,所以我为自己想出了这个,这就是我想出来的......

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

答案 3 :(得分: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; });

答案 4 :(得分:0)

在我的情况下,我有一个数组数组的数据,我使用了一种有点不同的方式混合 Cool Blue 解决方案。 我的数据就像

[[{
  "timestamp": 44299.46625605324,
  "dateTime": "2021-04-13T11:11:24.5237792Z",
  "value": 9.92,
  "status": 0
},
{
  "timestamp": 44299.466267627315,
  "dateTime": "2021-04-13T11:11:25.5237792Z",
  "value": 3.92,
  "status": 0
},],[{
  "timestamp": 44299.46625605324,
  "dateTime": "2021-04-13T11:11:24.5237792Z",
  "value": 9.92,
  "status": 0
},
{
  "timestamp": 44299.466267627315,
  "dateTime": "2021-04-13T11:11:25.5237792Z",
  "value": 3.92,
  "status": 0
},]]

我尝试在 x 轴上使用时间刻度并使用 dateTime 属性来获取刻度域。

d3.extent(data.reduce(function(m,d){
                            return m.concat(d3.extent(d, d => new Date(d.dateTime).valueOf()))
                        },[]))