2017-09-01 21 views
1

配列内で最小の数をとる関数があります。配列に文字列がない場合は0を返します。 - JS

私がしたことは、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

は、配列が負の数を格納することは可能ですか?もしそうでなければ 'smallestNum'を' Infinity'ではなく '0'に初期化することができます。 –

+1

'findSmallestNumberAmongMixedElements(['sam'、3、2、1])'は私のために '1'を返しています。他のテストケースを提供できますか? –

+0

上記の例では1ではなく4が返されます。 – stetsmando

答えて

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を使用して最小値を計算することはより簡単です。これにより、上記のコードで「バグ」を修正するのが簡単になります。[Infinity, "foo", Infinity]などの入力に対しては0が生成されます。このようなケースで0またはInfinityを返す方が良いかどうかはわかりません。そして、あなたは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'を使用して2番目の解決策を修正し、それを提案するように動作させました。 –

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)]に対して間違った答えを返します。正解はInfinityで、関数は0を返します。 – gidim

+1

正解はなぜInfinityですか?この関数は配列の中で最小の数を返すと仮定していますが、Array(Math.pow(10、1000))の中でInfinityが最小の数はどうですか? – Aydin4ik

+0

はいあなたは正しいです –

-1

あなたは初期値で、このフィルタ配列を減らす、

まず奇数アレイ#は減らす使用方法およびアレイ#フィルタを使用する非数値

セカンドをフィルタリングすることができ0 - 配列が長さ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]));

+0

質問の要求に従って要求された出力を生成するコードでダウンボートがコードにdownvoteを説明した場合、むしろ礼儀正しいでしょう –

関連する問題