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]して、RobG のやり方で行うこともできますundefinedx

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
});

次に、「最大」オブジェクトを取得するために、上部または下部の要素をポップします (ただし、並べ替えています)。

Array.Sort

于 2012-04-27T02:04:44.377 に答える