【jQuery】jsonからアイテムをランダム出力

例えばAから6個、Bから4個それぞれランダムで選ぶとき。
ajaxでjsonを読み込みます。

デモページ

html

  <p>今日のスムージーは・・・</p>
  <div id="result"></div>
  <p>で作ります!!!</p>

javascript

$(function () {

  //アイテムをランダムで出す
  var $result = $('#result');

  $.ajax({
    type: 'GET',
    url: 'item.json',
    dataType: 'json'
  }).then(
    function (data) {
      console.log('成功');

      var LIMIT_NUM = 10; //上限

      function choiceItem(fruitsItem) {
        var FRUITS_NUM = fruitsItem;
        var VEGETABLES_NUM = LIMIT_NUM - FRUITS_NUM;
        var itemChoiceArray = []; //itemのIDを入れる

        function itemChoice(allLen, maxNum, arrayI) {
          var randoms = []; //ランダムなarrayを入れる
          // 最小値と最大値
          var min = 0;
          var max = maxNum;
          var arrayLen = allLen - 1;

          // 重複チェックしながら乱数作成
          for (i = min; i < max; i++) {
            while (true) {
              var tmp = intRandom(min, arrayLen);
              if (!randoms.includes(tmp)) {
                randoms.push(tmp);
                itemChoiceArray.push(arrayI[tmp].id);
                break;
              }
            }
          }
          //min以上max以下の整数値の乱数を返す
          function intRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
          }
        }

        function shuffleArray(array) { //配列シャッフル
          for (var i = array.length - 1; i > 0; i--) {
            var j = Math.floor(Math.random() * (i + 1));
            if (i == j) continue;
            var k = array[i];
            array[i] = array[j];
            array[j] = k;
          }
          return array;
        }

        function createDOM(array) { //LIMIT_NUMの数だけdomを生成する

          for (var domNum = 0; domNum < LIMIT_NUM; domNum++) {

            var thisName;
            var thisNameEn;
            var dom;
            var str = String(array[domNum]);

            if (str.indexOf('fu') != -1) { //fruitsの場合
              for (var j in data['fruits']) {

                if (data['fruits'][j].id === array[domNum]) {
                  thisName = data['fruits'][j].name;
                  thisNameEn = data['fruits'][j].nameEn;
                  break;
                }
              }
              dom = '<p class="orange">' + thisName + '【' + thisNameEn + '】' + '<p>';

            } else { //vegetablesの場合
              for (var j in data['vegetables']) {
                if (data['vegetables'][j].id === array[domNum]) {
                  thisName = data['vegetables'][j].name;
                  thisNameEn = data['vegetables'][j].nameEn;
                  break;
                }
              }
              dom = '<p class="green">' + thisName + '【' + thisNameEn + '】' + '<p>';
            }
            $result.append(dom);
          }
        };

        for (var i in data) {
          var arrayLen;
          if (i === 'fruits') {
            arrayLen = data[i].length;
            itemChoice(arrayLen, FRUITS_NUM, data[i]);
          } else if (i === 'vegetables') {
            arrayLen = data[i].length;
            itemChoice(arrayLen, VEGETABLES_NUM, data[i]);
          }
          shuffleArray(itemChoiceArray);
          if (itemChoiceArray.length === LIMIT_NUM) {//配列が揃ったらdom生成開始
            createDOM(itemChoiceArray);
          }
        }
      }
      choiceItem(6); //引数はフルーツを選ぶ個数
      //フルーツ 6個、野菜4個で出る

    },
    function () {
      console.log('失敗');

    }
  );
});

item.json

 {
   "fruits": [{
     "id": "fu0",
     "name": "りんご",
     "nameEn": "apple"
   }, {
     "id": "fu1",
     "name": "あんず",
     "nameEn": "apricot"
   }, {
     "id": "fu2",
     "name": "さくらんぼ",
     "nameEn": "cherry"
   }, {
     "id": "fu3",
     "name": "プラム",
     "nameEn": "plum"
   }, {
     "id": "fu4",
     "name": "ぶどう",
     "nameEn": "grape"
   }, {
     "id": "fu5",
     "name": "メロン",
     "nameEn": "melon"
   }, {
     "id": "fu6",
     "name": "いちご",
     "nameEn": "strawberry"
   }, {
     "id": "fu7",
     "name": "バナナ",
     "nameEn": "banana"
   }, {
     "id": "fu8",
     "name": "オレンジ",
     "nameEn": "orange"
   }, {
     "id": "fu9",
     "name": "キウイ",
     "nameEn": "kiwi"
   }, {
     "id": "fu10",
     "name": "マンゴー",
     "nameEn": "mango"
   }],
   "vegetables": [{
     "id": "ve0",
     "name": "かぼちゃ",
     "nameEn": "pumpkin"
   }, {
     "id": "ve1",
     "name": "きゅうり",
     "nameEn": "cucumber"
   }, {
     "id": "ve2",
     "name": "大豆",
     "nameEn": "soybean"
   }, {
     "id": "ve3",
     "name": "人参",
     "nameEn": "carrot"
   }, {
     "id": "ve4",
     "name": "ほうれん草",
     "nameEn": "spinach"
   }, {
     "id": "ve5",
     "name": "セロリ",
     "nameEn": "celery"
   }, {
     "id": "ve6",
     "name": "トマト",
     "nameEn": "tomato"
   }, {
     "id": "ve7",
     "name": "小松菜",
     "nameEn": "komatsuna"
   }, {
     "id": "ve8",
     "name": "パプリカ",
     "nameEn": "paprika"
   }, {
     "id": "ve9",
     "name": "レタス",
     "nameEn": "lettuce"
   }, {
     "id": "ve10",
     "name": "キャベツ",
     "nameEn": "cabbage"
   }]
 }

ランダムな配列を用意する

ランダムな配列を作成する

        function itemChoice(allLen, maxNum, arrayI) {
          var randoms = []; //ランダムなarrayを入れる
          // 最小値と最大値
          var min = 0;
          var max = maxNum;
          var arrayLen = allLen - 1;

          // 重複チェックしながら乱数作成
          for (i = min; i < max; i++) {
            while (true) {
              var tmp = intRandom(min, arrayLen);
              if (!randoms.includes(tmp)) {
                randoms.push(tmp);
                itemChoiceArray.push(arrayI[tmp].id);
                break;
              }
            }
          }
          //min以上max以下の整数値の乱数を返す
          function intRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
          }
        }

//中略

        for (var i in data) {//jsonの配列の数だけ回しています
          var arrayLen;
          if (i === 'fruits') {
            arrayLen = data[i].length;
            itemChoice(arrayLen, FRUITS_NUM, data[i]);
          } else if (i === 'vegetables') {
            arrayLen = data[i].length;
            itemChoice(arrayLen, VEGETABLES_NUM, data[i]);
          }
          shuffleArray(itemChoiceArray);
          if (itemChoiceArray.length === LIMIT_NUM) {//配列が揃ったらdom生成開始
            createDOM(itemChoiceArray);
          }
        }

配列をシャッフルする

このままだとフルーツ6個の後に野菜4個が出てしまうので、配列をシャッフルします。

        function shuffleArray(array) { //配列シャッフル
          for (var i = array.length - 1; i > 0; i--) {
            var j = Math.floor(Math.random() * (i + 1));
            if (i == j) continue;
            var k = array[i];
            array[i] = array[j];
            array[j] = k;
          }
          return array;
        }
デモページ

まだまだ不慣れなところが多いですが、json使うの楽しいです。
アイテムページなど、デザインが同じで個数が多いものはjsonとかで出しちゃうと楽でいいなと思いました。