最小数量不包括零

时间:2012-05-11 19:03:47

标签: javascript

我需要从数字列表中找到最小数字,不包括零。

是否有一些内部功能可以做到这一点?或者,在使用Math.min之前,是否必须从列表中删除零?

示例:

输入:213032920299239

结果:32


[更新] 如果可能,请提供将输入作为参数的函数代码,例如nonZeroMin(213, 0, 32, 92, 0, 2992, 39)

6 个答案:

答案 0 :(得分:8)

var arr = [213, 0, 32, 92, 0, 2992, 39];

var min = arr.filter(function (x) { return x !== 0; })
    .reduce(function (a, b) { return Math.min(a, b); }, Infinity); 

alert(min);  // => 32

filterreduceArray的EcmaScript 5新增内容,但如果您需要在较旧的浏览器上运行,MDN会为 function minNonZero(var_args) { return Array.prototype.reduce.call(arguments, function (prev, current) { return prev && current ? Math.min(prev, current) : prev || current; }); } alert(minNonZero(213, 0, 32, 92, 0, 2992, 39)); 提供{{1}}。


编辑:这是一种在var-args样式函数中有效的简短方法。

{{1}}

答案 1 :(得分:8)

代码/解决方案:

var arr = [3, 0, 7, 12, 0, 5, 22];
var minValue = Math.min.apply(null, arr.filter(Boolean));

工作原理:

arr.filter创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。因此,在上面的代码中,数组的每个值都将由Boolean(value)

进行测试
Boolean(3) // true 
Boolean(0) // false
Boolean(7) // true
// ...

因此,我们将使用除零之外的所有元素的新过滤数组。

然后Math.min.apply(null, ...)在这样的数组中找到最小值。

在这种情况下,

null是一个上下文。它可以是nullthisMath - 结果将是相同的。

答案 2 :(得分:6)

你可以过滤除零以外的正数并对数组进行排序:

list.filter(function(x){ 
    return x> 0;
}).sort(function(a,b){
   return a>b;
})[0];

答案 3 :(得分:4)

这个怎么样?

var arry = [213, 0, 32, 92, 0, 2992, 39];
Math.min.apply(Math, arry.filter(Number)); // => 32

答案 4 :(得分:3)

您必须删除零,然后使用Math.min,如下所示:

function nonZeroMin() { // input can be as many parameters as you want
    var args = Array.prototype.slice.call(arguments);
    for(var i = args.length-1; i>=0; i--) {
        if(args[i] == 0) args.splice(i, 1);
    }

    return Math.min.apply(null,args);
}

根据更新的问题编辑以允许输入参数。

答案 5 :(得分:3)

如果你想创建一个带有未知数量参数的函数,你可以在该函数中使用arguments

要查找最低的非零数字,您可以对数组进行排序,并将零(和非数字)排序到最后。

function nonZeroMin(){
    var args = Array.prototype.slice.call(arguments);
    args.sort(function(a, b){
        if(a === null || isNaN(a) || a === 0) return 1;
        if(b === null || isNaN(b) || b === 0) return -1
        return a-b;
    });
    return args[0];
}

然后你可以:nonZeroMin(213, 0, 32, 92, 0, 2992, 39)