表2の要素を前、後、前、後と順に1に入れていくのですが、最後だけ以下のような結果になりません。
私の結果は、A,I,B,H,C,G,D,E,Fになり、EとFだけ結果のようなになりません。どこがおかしいのでしょうか。
表 1: A
表 2: B,C,D,E,F,G,H,I
結果: A,I,B,H,C,G,D,F,E
for ( var i = 0; i< array2.length; i++){ array1.push (array2.pop()); array1.push(array2.shift()); var hyo = array1.concat(array2); } console.log("表: ",hyo);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
いくつか変更して動かしてみました:
- 恐らく
array1
が求める結果であると推測されるので、質問文にありますhyo
については省略します。 for
文の条件がやや複雑なのでwhile
文にしました。while
文は無限ループに陥りやすくなる面もありますが、今回の場合は尺度(array2.length
)が明確であるため、このように書きました。- 実行中の変数の中身を見るため、適度に
console.log
を補っています。
main.js
:
js
1const array1 = ['A']; 2const array2 = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; 3 4while (array2.length > 0) { 5 console.log('---'); 6 console.log(`a1: ${array1}`); 7 console.log(`a2: ${array2}`); 8 9 array1.push(array2.pop()); 10 array1.push(array2.shift()); 11} 12 13console.log('==='); 14console.log('表: ', array1);
実行します:
$ node main.js --- a1: A a2: B,C,D,E,F,G,H,I --- a1: A,I,B a2: C,D,E,F,G,H --- a1: A,I,B,H,C a2: D,E,F,G --- a1: A,I,B,H,C,G,D a2: E,F === 表: [ 'A', 'I', 'B', 'H', 'C', 'G', 'D', 'F', 'E' ]
うまく動いているようですね。
ただ、上のコードは array2
の要素数が偶数であることを前提としているように見えます。
array2
の要素数を奇数にしてみましょう:
main.js
:
js
1const array1 = ['A']; 2 3const array2 = ['B', 'C', 'D']; 4// const array2 = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; 5 6while (array2.length > 0) { 7 console.log('---'); 8 console.log(`a1: ${array1}`); 9 console.log(`a2: ${array2}`); 10 11 array1.push(array2.pop()); 12 array1.push(array2.shift()); 13} 14 15console.log('==='); 16console.log('表: ', array1);
これも実行すると:
$ node main.js --- a1: A a2: B,C,D --- a1: A,D,B a2: C === 表: [ 'A', 'D', 'B', 'C', undefined ]
末尾に余計な undefined
が付いてしまいました。これは最後の繰り返しで、既に空になってしまった array2
を shift
した結果を array1
に追加していることによります。
array2
が空であれば shift
させたくないとなれば、次のように修正できます。
main.js
:
js
1const array1 = ['A']; 2 3// const array2 = ['B', 'C', 'D']; 4const array2 = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; 5 6while (array2.length > 0) { 7 console.log('---'); 8 console.log(`a1: ${array1}`); 9 console.log(`a2: ${array2}`); 10 11 array1.push(array2.pop()); 12 13 if (array2.length !== 0) { 14 array1.push(array2.shift()); 15 } 16} 17 18console.log('==='); 19console.log('表: ', array1);
実行しましょう:
$ node main.js --- a1: A a2: B,C,D --- a1: A,D,B a2: C === 表: [ 'A', 'D', 'B', 'C' ]
要素数が奇数でも意図通りに動作していますね。
投稿2020/08/11 00:04
編集2020/08/11 00:18総合スコア358
0
array2
をpop
やshift
で破壊的に変更しているためarray2.length
が減少していき3ループ目で終わっているためです。
最後にarray2
には["E", "F"]
が残りますが、その時点でi === 2
,array2.length === 2
となるためループを抜けてしまうためです。
javascript
1let array1 = ["A"]; 2let array2 = ['B','C', 'D', 'E', 'F', 'G', 'H', 'I']; 3for ( var i = 0; i< array2.length; i++){ 4array1.push (array2.pop()); 5array1.push(array2.shift()); 6var hyo = array1.concat(array2); 7console.log("array2.length --> ", array2.length) 8console.log("array1 --> ", array1); 9console.log("array2 --> ", array2); 10console.log("hyo --> ", hyo) 11} 12console.log("表: ",hyo);
出力結果
array2.length --> 6 array1 --> (3) ["A", "I", "B"] array2 --> (6) ["C", "D", "E", "F", "G", "H"] hyo --> (9) ["A", "I", "B", "C", "D", "E", "F", "G", "H"] array2.length --> 4 array1 --> (5) ["A", "I", "B", "H", "C"] array2 --> (4) ["D", "E", "F", "G"] hyo --> (9) ["A", "I", "B", "H", "C", "D", "E", "F", "G"] array2.length --> 2 array1 --> (7) ["A", "I", "B", "H", "C", "G", "D"] array2 --> (2) ["E", "F"] hyo --> (9) ["A", "I", "B", "H", "C", "G", "D", "E", "F"] 表: (9) ["A", "I", "B", "H", "C", "G", "D", "E", "F"]
投稿2020/08/11 00:03
総合スコア2411
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。