2017-02-24 1 views
0
私は小さな運動に取り組んでいる

なぜ私の配列の最後の要素はスプライシングではなく、未定義になっていますか?

=> ['kept','kept'] 

しかし、その代わりに、私はこのを得続ける:

enter image description here

function keep(array, keeper) { 

//This will return an array of undefined's and 'kept's 
// =>[ 'kept', undefined, 'kept', undefined, undefined ] 

    matchingNumbers = array.map(function matching(element){ 
    if (element === keeper) { 
     return element; 
    } 
    }); 


//Eliminate all undefined's from the matchingNumbers array 

    matchingLength = matchingNumbers.length; 
    for (var i = 1; i < matchingLength; i++) { 
    if(matchingNumbers[i] === undefined) { 
     (matchingNumbers.splice(i, 1)); 
    } 
    } 
    return matchingNumbers; 
} 

keep(['kept', 'thirty', 'kept', 2, 1], 'kept') 
問題は、私はこのをしたい ということです

私は、for-loopでmatchingNumbersのすべての未定義をスプライスしようとしています。だからなぜlaがあるのですか?残りは未定義ですか?

+2

あなた 'i'は、各反復の後にインクリメントされますが、あなたの配列が同時に要素を失っているので、' i'は必ずしも意味しませんインクリメント"次の要素"。 – Xufox

+1

最初に、配列はインデックス0から始まります。次に、[Array#filter](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) –

+1

を見てください上記のリンクにあるPolyfillを使用すると、コードをどのように記述した方がいいでしょうか?p –

答えて

4

関数がreturnステートメントを実行しない場合、デフォルトでundefinedが返されます。 array.map()は結果の配列に関数の戻り値を格納し、これにはundefinedの値が含まれます。

あなたが代わりに array.maparray.filterを使用する必要があります

matchingNumbers = array.filter(function matching(element){ 
    return element === keeper; 
}); 
+1

' array.filter'関数を使用した結果、2番目のループを実行する必要はないリストから 'undefined'sを削除してください。 array.filterを使用すれば十分です。正しく使用すると、 'undefined 'をリストに追加しません。 –

+0

@JerrySaraviaはい、それが意図であり、これが彼のコードのすべてを置き換えます。 – Barmar

+0

はい、わかりました。それは完全な関数定義を含んでおらず、それを完全には述べていないので、あなたの答えであまりにも明白ではありませんでした。 –

2

0の代わりにi1に開始していると思います。また、@Waliで述べたように、配列の長さを反復しながら変更しています。それを解決するために、逆の順序で配列を経る:サイドノートとして

for (var i = array.length; i > 0; i--) { 
    ... 
} 

、あなたがマッピングおよびスプライシングを扱うのではなく、Array.filterを使用して欲しいものを達成することができます。

+0

それは配列の長さの変更ではありません。例えば、プロセス要素3であり、3でスプライスすることを決定すると、テストされる次の要素は4ですがスプライスの前には5でした...元の要素4は現在3ですが、 == 4 ...スプライスの後、またはあなたが示唆したようにifの 'i - 'が後方にループする可能性があります。唯一の問題は、互いに隣り合う2つの '未定義 'がある場合です。 –

関連する問題