我这里有一个函数,它取一个数组中最小的数字。
我所做的是,我只使用typeof属性过滤掉了数字,并比较了Infinity中的值。
现在,如果数组为空,它将返回0。
但是,如果数组只包含字符串或其他数据类型,则它将返回Infinity。
这是我的代码:
function findSmallestNumberAmongMixedElements(arr) {
var smallestNum = Infinity;
if(arr.length !== 0){
for(var i = 0; i < arr.length; i++){
if(typeof arr[i] === 'number' && arr[i] < smallestNum){
smallestNum = arr[i];
}
}
return smallestNum;
}
return 0;
}
var output = findSmallestNumberAmongMixedElements(['sam', 3, 2, 1]);
console.log(output); // --> 4
如果数组中没有数字,它也必须返回0。
知道我在这里做错了什么吗?
答案 0 :(得分:2)
可能有一些更优雅的方法来解决这个问题。但这可以解决你的错误。
function findSmallestNumberAmongMixedElements(arr) {
var smallestNum = Infinity;
var numberFound = false
for(var i = 0; i < arr.length; i++){
if(typeof arr[i] === 'number' && arr[i] < smallestNum){
smallestNum = arr[i];
numberFound = true
}
}
if(numberFound)
return smallestNum;
return 0;
}
答案 1 :(得分:0)
function findSmallestNumberAmongMixedElements(arr) {
var smallestNum = Infinity;
if(arr.length !== 0){
for(var i = 0; i < arr.length; i++){
if(typeof arr[i] === 'number' && arr[i] < smallestNum){
smallestNum = arr[i];
}
}
return smallestNum == Infinity? 0 : smallestNum; // if smallest doesn't change return 0
}
return 0;
}
var output = findSmallestNumberAmongMixedElements(['sam', 3, 2, 1]);
console.log(output);
答案 2 :(得分:0)
问题在于你是特殊的 - 使用行
来填充空数组的情况if(arr.length !== 0){
删除它。然后,如果您想将结果Infinity
强制为0
,请在结尾处执行此操作。
function findSmallestNumberAmongMixedElements(arr) {
var smallestNum = Infinity;
for(var i = 0; i < arr.length; i++){
if(typeof arr[i] === 'number' && arr[i] < smallestNum){
smallestNum = arr[i];
}
}
return isFinite(smallestNum) ? smallestNum : 0;
}
但是,使用filter
过滤非数字更简单,并使用Math.min
计算最小值。这也更容易修复一个&#34; bug&#34;在上面的代码中,对于0
等输入,它将产生[Infinity, "foo", Infinity]
。我不确定您是否愿意在这种情况下返回0
或Infinity
。假设您确实要返回0
,那么
function findSmallestNumberAmongMixedElements(arr) {
var nums = ...arr.filter(elt => typeof elt === 'number');
return nums.length ? Math.min(...nums) : 0;
}
答案 3 :(得分:-1)
您可以使用奇怪的方式使用Array#reduce和Array#filter
首先,过滤掉非数字
第二次减少此过滤后的数组,初始值为0 - 如果数组长度为零,则reduce将返回0
function findSmallestNumberAmongMixedElements(arr) {
var smallestNum = Infinity;
return arr.filter(item => typeof item == 'number').reduce((min,item) => {
if(item < smallestNum) smallestNum = item;
return smallestNum;
}, 0);
}
console.log(findSmallestNumberAmongMixedElements([]));
console.log(findSmallestNumberAmongMixedElements(['1','2','3']));
console.log(findSmallestNumberAmongMixedElements([1,2,3]));
console.log(findSmallestNumberAmongMixedElements(['1',2,3]));
&#13;