0

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

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

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

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

4

3 回答 3

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
于 2012-04-27T02:12:25.067 回答
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,并按照 RobG 的方式进行操作:

for(var i = 1, max = a[0]; i < a.length; ++i)
    max = comparison(a[i], max);

这很好地避免了一堆typeof你真的不需要的运算符和比较。

于 2012-04-27T02:17:33.347 回答
0
[obj,obj,obj].sort(comparison)

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

然后弹出顶部或底部元素(无论您正在排序)以获得“最大”对象。

数组排序

于 2012-04-27T02:04:44.377 回答