Javascript 数组中基于函数的最大值
我有一个对象数组。我想根据一个函数找到这个数组的“最大值”,该函数返回给定2个对象时较大的对象Javascript 数组中基于函数的最大值,javascript,jquery,Javascript,Jquery,我有一个对象数组。我想根据一个函数找到这个数组的“最大值”,该函数返回给定2个对象时较大的对象 function comparison(first, second) { // ... arbitrary comparison based on properties... return first; // or second } var a = [obj1, obj2, obj3]; var maxObj = ????(comparison); 我在这里填什么?什么是优雅和简短
function comparison(first, second) {
// ... arbitrary comparison based on properties...
return first; // or second
}
var a = [obj1, obj2, obj3];
var maxObj = ????(comparison);
我在这里填什么?什么是优雅和简短
[obj,obj,obj].sort(comparison)
// aka
var sorted = [obj,obj,obj].sort(function(a,b){
// return 1/0/-1
});
然后弹出顶部或底部元素(无论您如何排序)以获得“max”对象
然后弹出顶部或底部元素(无论您如何排序)以获得“max”对象
类似的操作应该比排序更快(取决于数据): 示例: 更好的方法是使用:
类似的操作应该比排序更快(取决于数据): 示例: 更好的方法是使用:
显而易见的方法有什么不对
for(var i = 0, max; i < a.length; ++i)
max = typeof max == 'undefined' ? a[i] : comparison(a[i], max);
这很好地避免了一堆你真的不需要的
类型的运算符和比较。显而易见的方法有什么错
for(var i = 0, max; i < a.length; ++i)
max = typeof max == 'undefined' ? a[i] : comparison(a[i], max);
这很好地避免了大量的类型的
运算符和您真正不需要的比较。缺点是该函数修改了它的输入,这可能是个问题,也可能不是问题。+1表示减少
,但您需要特殊情况下空数组和只有一个元素的数组(取决于比较的行为),使用显式的初始值可能会有所帮助。啊reduce就是我要找的。谢谢!缺点是该函数修改了它的输入,这可能会有问题,也可能不会有问题。reduce
的+1,但您需要使用特殊情况空数组和只有一个元素的数组(取决于比较的行为),使用显式的初始值可能会有所帮助。啊,reduce就是我要找的。谢谢!这是有效的,但效率不高;查找最大值应该是O(n),而这是O(n^2)(更糟的情况)。这是有效的,但效率不高;查找最大值应该是O(n),而这是O(n^2)(更糟的情况).为什么不将max
初始化为a[0]
和i
作为1
并避免使用三元表达式?@mu blush当然你是对的;这根本不适用于这种情况。删除我愚蠢的评论。@RobG:这是个好主意,甚至在数组为空时也能正常工作,我想我仍然有C的旧习惯。为什么不将max
初始化为a[0]
和i
作为1
并避免三元表达式?@mu blush当然你是对的;这根本不适用于这种情况。删除我愚蠢的评论。@RobG:这是个好主意,甚至在数组为空时也能正常工作,我想我仍然有C的旧习惯。
for(var i = 0, max; i < a.length; ++i)
max = typeof max == 'undefined' ? a[i] : comparison(a[i], max);
for(var i = 1, max = a[0]; i < a.length; ++i)
max = comparison(a[i], max);