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

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

我可以这样做以获得最大的差异:

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

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

有什么想法吗?

你的问题是如何使用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 的值,我按降序返回对象,然后取第一个对象。

我相信

目前没有一种通过纯粹的 d3 来做到这一点的好方法。从 d3 文档中它指出:

使用自然顺序返回给定数组中的最大值。如果 数组为空,返回未定义。可选访问器函数 可以指定,相当于调用 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来处理这个问题。

相关问题:为什么域在 D3 中不使用 d3.max(数据(?

您也可以使用标准 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

最新更新