実現したいこと
Vue.jsでシフト表を作成したい
前提
【条件】メンバーは15人、週にみんな2回出勤、1日の出勤人数は6人
発生している問題・エラーメッセージ
現状は、ボタンをクリックすると1ヶ月分(4週分)のシフト表が表示されるようにはできました。
しかし、同じ曜日に所々、名前の重複が出てしまいます。
重複することなくメンバー全員が週に2回表示されるには、どのように記述すれば良いのでしょうか?
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <link rel="stylesheet" href="style.css"> 8 <title>シフト表自動作成(Vue.js)</title> 9 </head> 10 <body> 11 <div id="app" class="df"> 12 <div class="tbl"> 13 <table> 14 <thead> 15 <tr> 16 <th>月</th> 17 <th>火</th> 18 <th>水</th> 19 <th>木</th> 20 <th>金</th> 21 </tr> 22 </thead> 23 <tbody id="list"> 24 <tr v-for="week in names6" :key="week.weekNumber"> 25 <td v-for="day in week.days" :key="day.dayName"> 26 <div v-for="name in day.names" :key="name">{{ name }}</div> 27 </td> 28 </tr> 29 </tbody> 30 </table> 31 </div> 32 <div class="btn"> 33 <button v-on:click="buttonClick">ボタン</button> 34 </div> 35 </body> 36 <script src="https://cdn.jsdelivr.net/npm/vue@3.2.37/dist/vue.global.js"></script> 37 <script src="main.js"></script> 38</html> 39
css
1@charset "UTF-8"; 2 3table, th, td { 4 border: 1px #111 solid; 5 border-collapse: collapse; 6} 7 8th { 9 color: #fff; 10 background-color: #777; 11 width: 110px; 12} 13 14td { 15 text-align: center; 16} 17 18button{ 19 position: relative; 20 left: 30px; 21 top: 10px; 22} 23 24.df{ 25 display: flex; 26} 27 28tbody { 29 word-spacing: 20px; 30} 31
js
1Vue.createApp({ 2 data: function () { 3 return { 4 names: ["佐藤", "伊藤", "遠藤", "鈴木", "田中", "小林", "千葉", "加藤", "山崎", "中村", "高橋", "渡辺", "山本", "吉田", "石田", "佐藤", "伊藤", "遠藤", "鈴木", "田中", "小林", "千葉", "加藤", "山崎", "中村", "高橋", "渡辺", "山本", "吉田", "石田"], 5 names6: [], 6 } 7 }, 8methods: { 9 //ボタンが押された時の処理 10 buttonClick() { 11 //4週分繰り返す 12 for (let i = 0; i < 4; i++) { 13 //月~金をdaysOfWeekに格納 14 const daysOfWeek = ["月", "火", "水", "木", "金"]; 15 //namesの配列からデータの一部分だけ取り出しnamesCopyに格納 16 const namesCopy = this.names.slice(); 17 const weeks = 2; 18 //weeksを繰り返す 19 for (let i = 0; i < weeks; i++) { 20 const weekSchedule = { weekNumber: i + 1, days: [] }; 21 daysOfWeek.forEach((day) => { 22 const daySchedule = { dayName: day, names: [] }; 23 //6回繰り返す 24 for (let j = 0; j < 6; j++) { 25 if (namesCopy.length === 0) break; 26 //namesCopyの要素数を取得→ランダム→randomIndexに格納 27 const randomIndex = Math.floor(Math.random() * namesCopy.length); 28 //spliceで置き換えて、daySchedule.namesに追加する 29 daySchedule.names.push(namesCopy.splice(randomIndex, 1)[0]); 30 } 31 weekSchedule.days.push(daySchedule); 32 }); 33 //names6という空の配列に追加する 34 this.names6.push(weekSchedule); 35 } 36 } 37 }, 38}, 39mounted() { 40 for (let i = 0; i < buttonClick(); i++) { 41 } 42}, 43 44}).mount("#app") 45
やり方自体が間違っているのかもしれませんが、実現するためのヒントなどアドバイスいただければと思います。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/07/22 07:51
2023/07/22 08:02