我需要从数字列表中找到最小数字,不包括零。
是否有一些内部功能可以做到这一点?或者我必须在Math.min
使用之前从列表中删除零?
例子:
输入:213
, 0
, 32
, 92
, 0
, 2992
,39
结果:32
[更新]如果可能,请提供将输入作为参数的函数代码,例如nonZeroMin(213, 0, 32, 92, 0, 2992, 39)
我需要从数字列表中找到最小数字,不包括零。
是否有一些内部功能可以做到这一点?或者我必须在Math.min
使用之前从列表中删除零?
例子:
输入:213
, 0
, 32
, 92
, 0
, 2992
,39
结果:32
[更新]如果可能,请提供将输入作为参数的函数代码,例如nonZeroMin(213, 0, 32, 92, 0, 2992, 39)
代码/解决方案:
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
在这种情况下是一个上下文。它可以是null
, this
, Math
- 结果是一样的。
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
filter
并且reduce
是 EcmaScript 5 的补充Array
,但为它们MDN
提供了代码,以防您需要在较旧的浏览器上运行它。
编辑:这是在 var-args 样式函数中工作的更短的方法。
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));
您可以过滤除零以外的正数并对数组进行排序:
list.filter(function(x){
return x> 0;
}).sort(function(a,b){
return a>b;
})[0];
这个怎么样?
var arry = [213, 0, 32, 92, 0, 2992, 39];
Math.min.apply(Math, arry.filter(Number)); // => 32
您必须删除零,然后使用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);
}
编辑以允许根据更新的问题输入参数。
如果要创建一个带有未知数量参数的函数,可以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)
。