2017-09-01 133 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會相當有禮貌 –

相關問題