我试图从对象数组中获取元素的最大值:
var graph = {};
graph.data = [
{x: 2008, y: 7.2},
{x: 2009, y: 8.1},
{x: 2010, y: 7.7},
{x: 2011, y: 6.8},
{x: 2012, y: 6.7}
];
获得最大值,我使用以下内容:
var highest = graph.data[0].y;
for (var i = graph.data.length - 1; i >=1; i--) {
highest = Math.max(highest, graph.data[i].y);
}
这给了我正确的结果。 但是,当我尝试创建更高阶函数时,我可以重复使用它:
var getMax = function (arr, para) {
var highest = arr[0].para;
for (var i = arr.length; i >= 1; i--) {
highest = Math.max(highest, arr[i].para);
}
}
我试着像这样使用它:
getMax(graph.data, y);
我收到错误,说Uncaught: "Reference Error: y is not defined"
,有什么想法吗?
我确实尝试使用括号表示而不是第一个用于para,它没有工作
答案 0 :(得分:1)
试试这个:
var getMax = function (arr, para) {
var highest = arr[0][para];
for (var i = arr.length - 1; i >= 1; i--) {
highest = Math.max(highest, arr[i][para]);
}
return highest;
}
getMax(graph.data, 'y');
您不能只传递y
,因为y
未定义,因此将'y'作为字符传递。此外,您需要从函数返回最高值,并且需要从length - 1
答案 1 :(得分:0)
高阶函数是一个函数,它将函数作为参数,和/或返回一个函数。您可以使用高阶函数执行此操作,例如pluck
:
var pluck = function(x) {
return function(xs) {
return xs[x]
}
}
var max = function(x, y) {
return Math.max(x, y)
}
所以你得到:
var getMax = function(xs, x) {
return xs.map(pluck(x)).reduce(max)
}
var result = getMax(graph.data, 'y')
console.log(result) //=> 8.1
答案 2 :(得分:0)
您也可以使用 reduce :
graph.data.reduce(function(pre, cur){return pre.y > cur.y? pre : cur}).y;
可以将其转换为以下函数:
function getBiggest(arr, p) {
return arr.reduce(function (pre, cur){return pre[p] > cur[p]? pre:cur})[p];
}
getBiggest(graph.data, 'y') // 8.1
将其编写为循环可能需要更多代码,但通常运行速度更快,可能更容易维护:
function getBiggest(arr, p) {
for (var i=0, x=-Infinity, iLen=arr.length; i<iLen; i++) {
if (x < arr[i][p]) x = arr[i][p];
}
return x;
}
我认为使用 Math.max 来获取两个值中的较大值是过度的,但它有助于获得许多值的最大值,例如:
function getBiggest(arr, p) {
return Math.max.apply(Math, arr.map(function(v){return v[p]}));
}