我有以下数据,一个对象数组:
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.
有什么想法吗?
答案 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
进行排序,给定两个对象a
和b
,使用y
和y0
的差异对它们进行比较属性。通过从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来处理这个问题。
答案 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