2017-09-01 131 views
1

我有一个函数,它使用数组中的最小数字。如果数组中没有字符串,则返回0 - JS

我所做的是我只使用typeof属性过滤了数字,并比较了Infinity的值。

现在,如果数组为空,它将返回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; 
    } 
    return 0; 
} 


var output = findSmallestNumberAmongMixedElements(['sam', 3, 2, 1]); 
console.log(output); // --> 4 

它必须返回0,以及如果有数组中没有号码。

任何想法我在这里做错了什么?

+0

数组可能包含负数吗?如果不是,你可以将'smallestNum'初始化为'0'而不是'Infinity'。 –

+1

'findSmallestNumberAmongMixedElements(['sam',3,2,1])'正在为我返回'1'。你能提供其他的测试用例吗? –

+0

你上面的例子返回1而不是4. – stetsmando

回答

0

的问题是,你是特殊壳体的空阵的情况下,与线

if(arr.length !== 0){ 

卸下。然后,如果你想强制Infinity0的结果,那么最后这样做。

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最小。这也可以更容易地修复上面代码中的“bug”,也就是说,它将生成0,用于输入[Infinity, "foo", Infinity]等输入。我不确定您是否愿意在这种情况下返回0Infinity。假设你确实想要返回0,那么

function findSmallestNumberAmongMixedElements(arr) { 
    var nums = ...arr.filter(elt => typeof elt === 'number'); 

    return nums.length ? Math.min(...nums) : 0; 
} 
+0

这个解决方案是不正确的。输入的预期输出:[Math.pow(10,1000)]应该是无穷大,并且返回0. – gidim

+0

@gidim感谢您的评论。我不清楚OP的意图是什么。我已经对他的问题发表了评论,并要求他澄清这一点。与此同时,我已经使用'Math.min'修复了第二个解决方案,按照您的建议进行操作。 – 2017-09-01 19:17:08

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; 
} 
+0

这里'arr [i] brk

+0

@brk检查当前数字是否小于我们所见过的其他数字。 – gidim

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

这会返回[Math.pow(10,1000)]的错误答案。正确的答案是无穷大,你的函数返回0 ... – gidim

+1

为什么正确的答案无穷大?该函数应该返回数组中最小的数字,Infinity是Array中最小的数字(Math.pow(10,1000))? – Aydin4ik

+0

是的,你是对的 –

-1

你可以使用使用的奇方式阵列#减少和Array#滤波器

首先,过滤掉非数字

其次减少这种过滤阵列,其中的初始值为0 - 如果阵列长度为零,则减少将返回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]));

+0

如果downvoter解释代码产生所需输出的代码downvote会相当有礼貌 –

相关问题