我有一个对象数组。我想根据一个函数找到这个数组的“最大值”,该函数在给定2个对象时返回更大的对象。
function comparison(first, second) {
// ... arbitrary comparison based on properties...
return first; // or second
}
var a = [obj1, obj2, obj3];
var maxObj = ????(comparison);
我在这里填写什么?什么是优雅和短暂的?
答案 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”对象。