D3:使用d3.max获取包含对象?

时间:2013-10-10 18:50:25

标签: d3.js

我有以下数据,一个对象数组:

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 }
]

我希望使用D3找到yy0之间差异最大的对象。

我可以这样做以获得最大的不同:

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

它返回150.但是我不知道怎么做是获取包含对象,并了解x的对应值是1.

有什么想法吗?

3 个答案:

答案 0 :(得分: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的差异对它们进行比较属性。通过从a中减去b的值,我将按降序返回对象,然后获取第一个对象。

答案 1 :(得分:1)

我相信目前通过纯粹的d3做到这一点并不是一个好方法。从d3文档中可以看出:

  

使用自然顺序返回给定数组中的最大。如果   数组为空,返回undefined。可选的访问器功能   可以指定,这相当于调用array.map(accessor)   在计算最大之前。

我进入源代码看看如何计算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?

答案 2 :(得分:0)

您也可以使用标准的array.reduce函数来查找它而不使用d3:

var highestDiscrepencyObject = data.reduce(function(memo, val){
  var dis = val.y - val.y0,
      memoDis = memo.y - memo.y0;

  return (dis > memoDis || memo.y === undefined) ? val : memo;
}, {});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce