質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

455閲覧

2の要素を1の配列へ前後から順に入れていくのですが、最後だけ理想の結果になりません。

Chibichan

総合スコア72

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/10 18:20

表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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/08/10 21:19 編集

array1とarray2の定義を追記願います。 コピペで再現できる情報ですね。
guest

回答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 が付いてしまいました。これは最後の繰り返しで、既に空になってしまった array2shift した結果を 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
gemmaro

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chibichan

2020/08/11 05:08

While文にするのは、思いつきませんでした!回数が決まっているとついFor文と思ってしまいますが、While文がいい時もあるんですね!奇数の場合も提示していただいてありがとうございました。勉強になりました。
guest

0

array2popshiftで破壊的に変更しているため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

nekoniki

総合スコア2411

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chibichan

2020/08/11 05:09

ありがとうございます。その点が理解できなかったところです。ようやく理解できました。
guest

0

javascript

1var a=["A"]; 2var b=["B","C","D","E","F","G","H","I"]; 3var flg=true; 4while(b.length>0){ 5 a.push(flg?b.pop():b.shift()); 6 flg=!flg; 7} 8console.log(a);

投稿2020/08/11 02:45

yambejp

総合スコア115010

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問