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

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

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

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

Q&A

解決済

2回答

665閲覧

画像を順番に取り出す

donkuri

総合スコア81

JavaScript

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

0グッド

1クリップ

投稿2021/12/28 06:16

編集2021/12/28 08:36

前提・実現したいこと

let number = 0; const images = ["img01","img02","img03","img04","img05"];

このように画像が入った配列imagesがありまして,
numberの数字を増やしていった時に順番に画像を取り出したいです。

試したこと

images[number % images.length]

これで出来たと思いましたが、これだと

img01→img02→img03→img04→img05→img01→img02,→...

となります。
そうではなくて、

img01→img02→img03→img04→img05→img04→img03,→...

としたいです。
img05まで行ったあと、img01に戻るのではなくimg04に戻りたいです。

あとnumberが-1,-2,...になった時もimg02,img03と順番に出したいです。

つまり

number -2 -1 0 1 (略) 4 5 6 images img03 img02 img01 img02 (略) img05 img04 img03

こんな感じにしたいのです。
どなたかご教授お願いいたします。

補足

説明が難しいので、ここにコードを上げてみました。

https://jsfiddle.net/gyot3ce2/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

skys215

2021/12/28 07:00

numbersがプラスの時は4->5->4と戻るけど、マイナスの場合はどうですか? 0->-1->-2->-3->-4->-5 img01->img05>img04->img03->img02->img01->?そのあとはimg05ですか?それともimg02ですか?
donkuri

2021/12/28 07:48

ありがとうございます。 説明が下手ですみません。 0->-1->-2->-3->-4->-5->-6->-7->-8->-9->-10... img01->img05>img04->img03->img02->img01->img05>img04->img03->img02->img01->... こうしたいです。
donkuri

2021/12/28 07:49

あ すみませんちょっと考え直します
donkuri

2021/12/28 08:01

申し訳ありません。 私が考え違いをしていまして、 0->-1->-2->-3->-4->-5 img01->img02>img03->img04->img05->img04->... こうなるのが正しい形でした。 質問文を訂正しておきます。
guest

回答2

0

ベストアンサー

ボールドテキスト命題が合理的ではありません
1→2→3→4→5→4→3・・・となるなら
遡る方も
1←5←4←3ではなく
1←2←3←4←5←4←3となるべきです

sample

こんな感じでどうでしょう?

javascript

1<textarea cols=40 rows=10></textarea> 2<script> 3const images = ["img01","img02","img03","img04","img05"]; 4const len=images.length; 5const getIndex=number=>{ 6 let idx=Math.abs(number)%((len-1)*2); 7 if(idx>=len) idx=(len-1)*2-idx; 8 return idx; 9} 10for(let number=-30;number<30;number++){//numberを適当な範囲で変更 11 document.querySelector('textarea').value+=images[getIndex(number)]; 12} 13</script>

表にするとこうです

numberMath.abs(number)Math.abs(number)%((len-1)*2)idx>=len(len-1)*2-idx;
-10102
-991
-880
-777true1
-666true2
-555true3
-444
-333
-222
-111
000
111
222
333
444
555true3
666true2
777true1
880
991
1012

投稿2021/12/28 06:41

編集2021/12/28 09:13
yambejp

総合スコア116724

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

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

donkuri

2021/12/28 07:50

なるほど 確かにそうですね。 すみませんちょっと考え直します
donkuri

2021/12/28 08:06

すみません。 やはりマイナスの時の動きが反対でした・ 質問文を修正しました。
yambejp

2021/12/28 08:36

追記しておきました
donkuri

2021/12/28 08:55

ありがとうございます! すみません Math.abs()は絶対値を取ってるのは分かったのですが、 %((len-1)*2 ここは何をしているのでしょうか。。 %len ならわかるのですが、なぜ-1して*2をするのでしょうか・・
yambejp

2021/12/28 09:19 編集

たとえばデータ数が5個あるなら 0→1→2→3→4→3→2→1(→0→1→・・・) という周期ができます。 要素数は(len-1)*2になります。 要素数=2:0→1 周期:2 要素数=3:0→1→2→1 周期:4 要素数=4:0→1→2→3→2→1 周期:6 その他計算の意味は表にしてあるので参考にしてください
donkuri

2021/12/28 09:20

表を書いて頂いてなんとなく分かってきた気がします。 周期も考えて場合分けしないといけないんですね。 難しいですがもう少し考えればなんとか理解できそうです。 ありがとうございました!
guest

0

yambejpさんのご回答にもあるように、正負で非対称なので条件式が含まれることになりそうです。

js

1let number = -10; 2const images = ["img01", "img02", "img03", "img04", "img05"]; 3while (number < 20) console.log(number, 4 (number < 0) ? 5 images[Math.abs(Math.abs(number++ + 1) % ((images.length - 1) * 2) - (images.length - 1))] : 6 images[Math.abs((number++ + images.length - 1) % ((images.length - 1) * 2) - (images.length - 1))] 7) 8 9/* 10-10 img04 11-9 img05 12-8 img04 13-7 img03 14-6 img02 15-5 img01 16-4 img02 17-3 img03 18-2 img04 19-1 img05 200 img01 211 img02 222 img03 233 img04 244 img05 255 img04 266 img03 277 img02 288 img01 299 img02 3010 img03 3111 img04 3212 img05 3313 img04 3414 img03 3515 img02 3616 img01 3717 img02 3818 img03 3919 img04 40 41*/ 42

追記

Math.sign を使って条件式を外してみましたが、かなり読みにくいコードになりました。

js

1while (number < 20) 2 console.log(number, 3 images[Math.abs((Math.abs(number + images.length * Math.sign(Math.sign(++number))) - 1) % ((images.length - 1) * 2) - (images.length - 1))], 4 );

質問の変更に合わせて追記

js

1let number = -10; 2const images = ["img01", "img02", "img03", "img04", "img05"]; 3while (number < 20) 4 console.log(number, 5 images[Math.abs((Math.abs(number++) + images.length - 1) % ((images.length - 1) * 2) - (images.length - 1))], 6 );

投稿2021/12/28 07:04

編集2021/12/28 08:57
Lhankor_Mhy

総合スコア36960

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

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

donkuri

2021/12/28 07:51

ありがとうございます! せっかく作っていただいたのですが、 すみませんちょっと私が考え違いしていたかもしれません。 ちょっと考え直します
donkuri

2021/12/28 08:05

せっかく回答して頂いたのに申し訳ありません。 私の質問文のマイナスの時の順番が反対でした。 質問文を修正しました。
donkuri

2021/12/28 09:22

ありがとうございました! 計算式が難しくて理解が追いつきませんが、頂いた回答で色々考えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問