0

我想知道对于具有两个或多个参数的 min() 函数,JS 中最好的算法是什么?

注意:它应该适用于可以与“>”或“<”运算符进行比较的任何 JS 类型。例如:

   min( new Date(1959,6,3), new Date(1960,7,8), new Date(1925,6,9));
   /*
     should return: Thu Jul 9 00:00:00 UTC+0200 1925
   */

因此 Math.min 和 Math.max 可能不是很好的候选者。

谢谢 ...

编辑:我想沿着这些思路:

   "use strict" ;
   var  d1 = new Date(1959,6,3), d2 = new Date(1960,7,8), d3 = new Date(1925,6,9) ;

   function min (a,b)
   {
    if ( arguments.length > 2 ) {
        var args = Array.prototype.slice.call(arguments,0) ;
           args.shift() ;
              args[0] = min(a,b) ;
       return min.apply( this, args ) ;     
    }
    else {
            return a > b ? b : a ;
    }
   }
    min(d1,d2,d3);
   /*
    returns: Thu Jul 9 00:00:00 UTC+0200 1925
   */

上面可以优化,但它也适用于 2 个或更多数字和字符串。当然在 JS 内在比较器规则中。

4

3 回答 3

2

看这个小提琴

function min(/*...args...*/){
    var len = arguments.length;

    if(len < 1)
        return null;

    var lowest = arguments[0];
    for(var i = 0; i < len; i++){
        if(arguments[i] < lowest)
            lowest = arguments[i];
    }

    return lowest;
}

唯一的事情是(您应该根据需要更改它)是如果没有传递任何参数,它将返回NULL。The Function 可以接受任意数量的参数。

于 2013-07-23T07:36:01.050 回答
1

我认为Min()没关系

来自 W3schools:

返回具有最小值的数字:

var a=Math.min(5,10);
var b=Math.min(0,150,30,20,38);
var c=Math.min(-5,10);
var d=Math.min(-5,-10);
var e=Math.min(1.5,2.5);

a、b、c、d 和 e 的结果将是:

5
0
-5
-10
1.5
于 2013-07-23T07:32:09.517 回答
0

也许这是最佳解决方案:

   "use strict"
    var arr = create_array_of_any_scalar_type_for_testing();
    var min = arr.reduce(function(a, b) {return a < b ? a : b ; });

我也敢想,在所有现代浏览器上,这也是最快的解决方案。完整的打包解决方案可能是这样的:

   "use strict" ;

   function min (a,b)
   {
    if ( arguments.length > 2 ) {
        var args = Array.prototype.slice.call(arguments,0) ;
        return args.reduce(function(a, b) {return a < b ? a : b ; });
    }
    else {
            return a > b ? b : a ;
    }
   }  

   /* quick test with dates */
   var  d1 = new Date(1959,6,3), d2 = new Date(1960,7,8), d3 = new Date(1925,6,9) ;

    min(d1,d2,d3);
   /*
    returns: Thu Jul 9 00:00:00 UTC+0200 1925
   */

享受 。

于 2013-07-23T10:57:38.940 回答