2012-04-27 4 views
0

개체 배열이 있습니다. 이 배열의 "최대 값"을 찾는 것은 객체가 2 개인 경우 더 큰 객체를 반환하는 함수를 기반으로합니다.배열의 최대 값, 함수를 기반으로

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

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

여기에 무엇을 기입합니까? 우아하고 짧은 무엇입니까?

답변

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 
+2

단점은 해당 기능이 입력을 수정했거나 문제가되지 않을 수도 있다는 것입니다. –

+0

+1에 대해서는'reduce'를 쓰지 만, 특별한 경우 빈 배열과 배열은 하나의 요소 만 필요합니다 ('comparison'의 행위에 따라). 명시 적 초기 값을 사용하면 도움이됩니다. –

+0

아, 내가 원하는 것을 줄이려고했다. 감사! –

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

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

그런 다음 "최대"개체를 얻으려면 상단 또는 하단 요소를 팝 (정렬)하십시오. 이 같은

Array.Sort

+0

[기본 예] (http://jsfiddle.net/Ze86B/) –

+0

효과적이지만 비효율적입니다. O (n^2) (최악의 경우) 동안 max는 O (n)이어야합니다. – Phrogz

1

무엇이 잘못 되었나요? 확실한 접근법이 있습니까?

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

원하는대로 마무리하십시오.


또는 당신은 a = []; x = a[0]xundefined 당신을 남긴다는 사실을 활용하고 그것을 RobG의 방법으로 수행 할 수 있습니다 잘 typeof 사업자 및 비교의 무리를 피할 수

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

을 당신 정말 돈 필요 없어.

+2

'max'를'a [0]'으로,'i'를'1'로 초기화하고 삼항 표현식을 피할 수 밖에없는 이유는 무엇입니까? – RobG

+0

@mu * blush * 물론 당신 말이 맞습니다. 이 경우에는 전혀 적용되지 않습니다. 내 바보 같은 말을 지우세요. – Phrogz

+0

@RobG : 그게 좋은 생각이고, 배열이 비어있을 때 제대로 작동한다고해도, 나는 아직도 C에서 오래된 습관을 가지고있는 것 같아요. –