Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中基于函数的最大值_Javascript_Jquery - Fatal编程技术网

Javascript 数组中基于函数的最大值

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); 我在这里填什么?什么是优雅和简短

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

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