配列の要素が次の項目で割り切れるかどうかを配列をチェックする関数を作成しました。そうでない場合は、配列から次の項目を削除します。
2つの配列で構成されるテスト配列を作成しました。それらをループしてconsole.logを実行すると、期待どおりに返されます。
console.logではなくforループで関数(deleteItem)を呼び出すと、2番目ではなく最初の配列要素の結果が返されます。私は本当に混乱していて、これを理解していません。誰かが私が間違っていることのヒントを教えてもらえますか?
前もって感謝します!
let testArray = [[240,12, 10, 8,23],[240,12, 10, 8,24]];
function deleteItem(array) {
if(array.length<=1){
return array;
}
else{
for(i=0; i<array.length-1;i++) {
let changed = true;
while(changed){
if(array[i]%array[i+1]!=0) {
array.splice(i+1,1);
i=0;
break;
}
else {changed=false};
}
}
}
return array;
}
コンソールログのみの場合、期待どおりに両方の要素が返されます。
for(i=0;i<testArray.length;i++){
console.log( testArray[i]);
//console.log(deleteItem( testArray[i]));
}
returns:
[240, 12, 10, 8, 23]
[240, 12, 10, 8, 24]
関数を使用すると、最初の配列要素のみが呼び出されます
for(i=0;i<testArray.length;i++){
console.log( testArray[i]);
console.log(deleteItem( testArray[i]));
}
returns:
[240, 12, 10, 8, 23]
[240, 12]
I expect:
[240, 12, 10, 8, 23]
[240, 12]
[240, 12, 10, 8, 24]
[240, 12]
forループ変数を「let」で宣言することを忘れないでください。レットを追加するとすぐに正常に動作します。(deleteItem関数内でも同じ)
for(let i = 0; i < testArray.length; i++){
console.log(testArray[i]);
console.log(deleteItem(testArray[i]));
}
testArrayをループしてすべての要素を出力するだけで問題はありませんが、deleteItem()関数内に、ローカルで宣言されていない「i」という名前の変数を持つ別のforループがあります。
つまり、グローバルi = 0でtestArrayループを開始します。次に、同じグローバルiをforループに使用するdeleteItem関数を呼び出します。したがって、deleteItem関数が実行された後、グローバルiは4に設定され、元のforループ条件は保持されなくなります。これが、2番目のtestArray要素に対してdeleteItem関数が呼び出されない理由です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加