数组中的最大值,基于函数

时间:2012-04-27 02:02:00

标签: javascript jquery

我有一个对象数组。我想根据一个函数找到这个数组的“最大值”,该函数在给定2个对象时返回更大的对象。

function comparison(first, second) {
    // ... arbitrary comparison based on properties...
    return first; // or second
}

var a = [obj1, obj2, obj3];
var maxObj = ????(comparison);

我在这里填写什么?什么是优雅和短暂的?

3 个答案:

答案 0 :(得分:2)

这样的事情应该比排序更快(取决于数据):

/*
  values: array of values to test.
      fn: function that takes two arguements and returns true if the first is bigger.
*/
var maximum = function(values, fn) {
    var currentValue, maxValue = values.pop();
    while(values.length)
        maxValue = fn(maxValue, currentValue = values.pop()) ? maxValue : currentValue;
    return maxValue;
}

示例:http://jsfiddle.net/SaBJ4/2/

更好的是,使用Array.reduce

var a = ['abc', 'defg', 'highlkasd', 'ac', 'asdh'];
a.reduce(function(a, b) { return a.length > b.length ? a : b; }); // highlkasd

答案 1 :(得分:1)

这种显而易见的方法出了什么问题?

for(var i = 0, max; i < a.length; ++i)
    max = typeof max == 'undefined' ? a[i] : comparison(a[i], max);

随便把它包起来。


或者您可以利用a = []; x = a[0] undefined x for(var i = 1, max = a[0]; i < a.length; ++i) max = comparison(a[i], max); 留下typeof并以RobG的方式执行操作的事实:

{{1}}

很好地避免了一堆你真正不需要的{{1}}运算符和比较。

答案 2 :(得分:0)

[obj,obj,obj].sort(comparison)

// aka
var sorted = [obj,obj,obj].sort(function(a,b){
  // return 1/0/-1
});

然后关闭顶部或底部元素(但是你要排序)以获得“max”对象。

Array.Sort