3

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

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找到y和之间差异最大的对象。y0

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

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

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

有任何想法吗?

4

3 回答 3

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使用一个函数进行排序,给定两个对象a和,使用它们的和属性b的差异来比较它们。通过减去from的值,我按降序返回对象,然后取第一个对象。yy0ab

于 2013-10-10T19:00:00.333 回答
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 来处理这个问题。

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

于 2013-10-10T19:43:02.507 回答
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

于 2013-10-10T19:25:53.010 回答