>我有以下数据,一个对象数组:
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。
有什么想法吗?
你的问题是如何使用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
,使用它们的y
和y0
属性的差异来比较它们。通过从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