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

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

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

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

Q&A

解決済

2回答

763閲覧

ロードする度に4個の中からランダムに2つだけ表示さたい

okama

総合スコア22

JavaScript

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

0グッド

0クリップ

投稿2020/06/18 05:57

編集2020/06/18 06:49
<li>〜</li>が4個あったとして その中からランダムに2つだけを表示させたいです。 (例で4個中2個としていますが組み合わせ自由にできるとありがたいです・・ex10個中3個とか)

追記:
リストで並べたものを「ロードの度に並び替える」というところまで記述しております。
これに「4個中2個だけ表示させる」(リロードする度にランダム)という記述を追記したいのですが書き方がわかりませんでした。

例:dポイントクラブの「おすすめの情報」というところのような想定です。
表示されているのは30個ですが本当は30以上のバナーがあると思います。
https://dpoint.jp/index.html

稚拙な文章ですみませんがご教授お願いいたします。

<!-- html --> <ul class="contentBox"> <li>   <p>お店01</p> <div class="img"><a href="" target="_blank"><img src="images/01.png" alt="いちご"></a></div> </li> <li>   <p>お店02</p>   <div class="img"><a href="" target="_blank"><img src="images/02.png" alt="にんじん"></a></div> </li> <li>   <p>お店03</p>   <div class="img"><a href="" target="_blank"><img src="images/03.png" alt="いちご"></a></div> </li> <li>   <p>お店03</p>   <div class="img"><a href="" target="_blank"><img src="images/04.png" alt="にんじん"></a></div> </li> <li>   <p>お店04</p>   <div class="img"><a href="" target="_blank"><img src="images/05.png" alt="にんじん"></a></div> </li> </ul>
<!-- ランダム表示 --> $(function(){ var randomContent = []; $('.contentBox li').each(function() { randomContent.push($(this).html()); }); randomContent.sort(function() { return Math.random() - Math.random(); }); $('.contentBox li').empty(); i = 0; $('.contentBox li').each(function() { $(this).append(randomContent[i]); i++; }); });

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

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

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

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

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

kei344

2020/06/18 06:27

「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを、出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。
okama

2020/06/18 06:50

コメントありがとうございます。 補足と例サイトを追記致しました。
guest

回答2

0

js

1 2$(function(){ 3 var randomContent = []; 4 $('.contentBox li').each(function() { 5 randomContent.push($(this).html()); 6 }); 7 8 randomContent.sort(function() { 9 return Math.random() - Math.random(); 10 }); 11 $('.contentBox li').empty(); 12 i = 0; 13 $('.contentBox li').each(function() { 14 if ( i > 2 ) return;// 単純に3つしか出さない場合 15 $(this).append(randomContent[i]); 16 i++; 17 }); 18}); 19```**動くサンプル:**[https://jsfiddle.net/rx0qLnzy/1/](https://jsfiddle.net/rx0qLnzy/1/) 20 21--- 22 23 24```js 25$(function(){ 26 var randomContent = []; 27 $('.contentBox li').each(function() { 28 randomContent.push($(this).html()); 29 }); 30 31 randomContent.sort(function() { 32 return Math.random() - Math.random(); 33 }); 34 $('.contentBox li').empty(); 35 $('.contentBox li:nth-of-type(3) ~ li').remove(); // 3以降を先に削除 36 $('.contentBox li').each(function(i) { 37 $(this).append(randomContent[i]); 38 }); 39}); 40```**動くサンプル:**[https://jsfiddle.net/rx0qLnzy/2/](https://jsfiddle.net/rx0qLnzy/2/)

投稿2020/06/18 07:57

kei344

総合スコア69606

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

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

okama

2020/06/18 11:37

ありがとうございます! IEでも動作確認でき大変感動しております。。。 ご丁寧にありがとうございました!
guest

0

ベストアンサー

こんにちは

一例として、以下のような考え方の回答を挙げます。(全 <li>の個数を n、そのうち表示する個数を m とします。)

  • <ul> のスタイルに、display: flex; を追加する。またこの追加により、ulで囲まれる要素のスタイルにも調整が必要であれば適宜修正する。
  • 0以上(n-1)以下のn個の整数を含み、並び順はランダムな配列 randomOrders を作る。(全5個であれば、たとえば[3,1,4,2,0]など)
  • <li>を each でループさせ、インデクスi<li> に以下のCSSを設定する。  

 ・order : 上記の randomOrders[i]の値を設定
display : im よりも小さければ block、そうでなければ none を設定

上記のステップの中で、

  • 0以上(n-1)以下のn個の整数を含み、並び順はランダムな配列 randomOrders を作る。

というコードを自作するのもよいですが、配列やオブジェクトの操作で便利なライブラリlodashの _.shuffle を使うこともできます。

以下は上記の考え方によるコードです。

css

1ul { display: flex; flex-direction:column; }

javascript

1 const items = $('li'); 2 const n = items.length; 3 const m = 2; 4 const randomOrders = _.shuffle([...Array(n)].map((_e, i) => i)); 5 6 items.each(function(i) { 7 const order = randomOrders[i]; 8 $(this).css({ order, display: order < m ? 'block' : 'none' }); 9 });

参考になれば幸いです。

追記

参考までに、もう一案挙げておきます。こちらは <ul> のCSS displayflex にする必要はありませんし、また <li> にもスタイルを追加しません。ただし、ランダムに表示する2個以外の li はDOMツリーから無くなります。

javascript

1var randomItems = _.sampleSize($('li').get(), 2); 2$('ul').empty().append(randomItems);

上記では、lodash の_.sampleSize を使っています。

投稿2020/06/18 07:06

編集2020/06/18 08:17
jun68ykt

総合スコア9058

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

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

okama

2020/06/18 08:00 編集

コメントいただきありがとうございます、、!! まさにcodepenで確認させていただいた動作が理想です! ですが、試してみたのですがなぜ全く 動きませんでした。。 ランダムにも2個表示にもなりません・・ コピペして全く同じもの記載してみてもダメでした。。 const randomOrders = _.shuffle([...Array(n)].map((_e, i) => i)); に[uncaught ReferenceError: _ is not defined] const items = $('li'); に[Parsing error: The keyword 'const' is reserved] と出てしまうのですがここが何か関係しているでしょうか。。 jqueryは以下を読み込んでおります。 <script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script>
jun68ykt

2020/06/18 07:57

コメントありがとうござます。 > const items = $('li'); > に[Parsing error: The keyword 'cost' is reserved] > と出てしまう のであれば const items = $('li'); で、 "const" と書くべきところを "cost" と書いてしまっており、 n が抜けているかもしれませんが、いかがでしょう?
jun68ykt

2020/06/18 07:59

すみません。上記のコメントは無視してください。
okama

2020/06/18 08:00

すみません! 私のコメントミスで投稿し直しました!
jun68ykt

2020/06/18 08:05

次に、 > Parsing error: The keyword 'const' is reserved についてですが、const が使えない設定のようですので、とりあえず、回答に挙げたコードの中で使っている const を var に変えてみると、いかがでしょうか?
okama

2020/06/18 08:10

あ、、、、すみません、、、>< それでした、、、、ありがとございます!!!できました!!
jun68ykt

2020/06/18 08:18

どういたしまして???? > できました!! とのことでよかったです。別案も追記しました。ご参考まで。
okama

2020/06/18 09:20

何から何までとても助かりました! まだ理解が及ばない箇所が多々あるので、教えていただいた内容で勉強させていただきます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問