高阶函数变量未定义的javascript

时间:2014-12-22 00:05:42

标签: javascript higher-order-functions

我试图从对象数组中获取元素的最大值:

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,它没有工作

3 个答案:

答案 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]}));
}