最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于JavaScript開發(fā)一個有趣的分組抽簽小程序

 更新時間:2023年05月30日 08:35:27   作者:??????????????????  
在團隊合作開發(fā)中,經(jīng)常需要將團隊成員分組,來完成各自的任務(wù),而抽簽的方式自然是最公平、最簡單的方法之一,所以本文就來開發(fā)一個有趣的分組抽簽小程序吧

前言

今天我要和大家分享一個非常有用的js算法:分組抽簽。在團隊合作開發(fā)中,經(jīng)常需要將團隊成員分組,來完成各自的任務(wù)。而抽簽的方式自然是最公平、最簡單的方法之一。

需求分析

在介紹具體的抽簽算法之前,我們先來分析一下這個問題的需求。我們需要從團隊成員列表中隨機抽取若干人,并將這些人分配到不同的組中。那么,如何才能確保分組的公平性呢?

公平性的要求

首先,我們需要確保每個人只會被抽中一次,避免出現(xiàn)某個人被抽到多個組的情況。其次,我們需要盡可能地讓每個組的人數(shù)相近,以確保各組的工作量基本相同。

算法設(shè)計思路

在滿足上述需求的前提下,我們可以通過以下算法來進行分組抽簽:

1.將團隊成員列表隨機排序。

2.根據(jù)分組的數(shù)量,計算每個組應該包含的人數(shù),記為baseNum。

3.依次遍歷團隊成員列表,將每個人放入對應的組中。具體操作步驟如下:

  • 如果該人已經(jīng)被分配了組,直接跳過。
  • 如果該人所在的組未滿員,將其加入該組,并標記為已分組。
  • 如果該人所在的組已滿員,尋找下一個未滿員的組,將其加入該組,并標記為已分組。如果沒有未滿員的組,則隨機選擇一個非自己所在組的未滿員組,將其加入該組,并標記為已分組。

通過以上闡述可知,核心的算法思路是要隨機排序、盡量平均分組并避免同一人多次參與?,F(xiàn)在我們開始著手編寫這個算法。

開始編碼

隨機排序

為了實現(xiàn)隨機排序,我們可以先將團隊成員數(shù)組進行淺拷貝,然后使用Array.sort()方法來進行排序,代碼如下:

function shuffle(array) {
  const arr = [...array]; // 進行淺拷貝
  for (let i = arr.length - 1; i > 0; i--) { // 遍歷數(shù)組元素
    const j = Math.floor(Math.random() * (i + 1)); // 生成隨機下標
    [arr[i], arr[j]] = [arr[j], arr[i]]; // 交換位置
  }
  return arr; // 返回排序后的數(shù)組
}

該方法接受一個數(shù)組作為參數(shù),返回亂序排列之后的新數(shù)組。

盡可能平均分組

為了實現(xiàn)盡量平均分組,我們可以使用Math.ceil()方法來向上取整,保證每個組的人數(shù)不少于baseNum。代碼如下:

const team = ['張三', '李四', '王五', '趙六', '錢七', '孫八']; // 假設(shè)有6名成員
const groupNum = 3; // 定義需要抽幾組
const baseNum = Math.ceil(team.length / groupNum); // 計算每組包含的人數(shù)
console.log(baseNum); // 輸出2

避免同一人多次參與

為了避免同一個人多次參與分組,我們需要給已經(jīng)分配了組的成員打上已分組的標記,這樣在后續(xù)循環(huán)中就可以跳過已經(jīng)分配了組的成員。代碼如下:

const team = ['張三', '李四', '王五', '趙六', '錢七', '孫八']; // 團隊成員數(shù)組
const groupNum = 3; // 分組數(shù)
const baseNum = Math.ceil(team.length / groupNum); // 計算每組需要包含多少人
const shuffledTeam = shuffle(team); // 亂序排列團隊成員 
let assignedCount = 0; // 計數(shù)器,記錄已分配的人數(shù)
let groups = []; // 定義一個空數(shù)組,用來存放每個分組的成員
// 遍歷隨機排序后的團隊成員列表,進行分組
shuffledTeam.forEach(member => {
  if (member.assigned) return; // 如果該成員已被分配,則跳過
  for (let i = 0; i < groupNum; i++) {
    const group = groups[i] || []; // 如果當前分組未定義,則將其初始值設(shè)為空數(shù)組
    if (group.length < baseNum && !group.includes(member)) { // 如果該分組未滿員,并且該成員沒有被分配到其他組內(nèi)
      group.push(member); // 將該成員加入當前分組
      member.assigned = true; // 給該成員打上已分組標記
      assignedCount++; // 記錄已分配人數(shù)
      groups[i] = group; // 將該分組重新賦值給原數(shù)組
      break; // 遍歷下一個成員
    }
  }
});

在上述代碼中,我們使用了一個名為assigned的屬性作為已分組標記。每位成員在初始化時都未被分組,因此默認為undefined。當某位成員被分配到某個組內(nèi)后,我們就會將其assigned屬性設(shè)置為true,以避免重復分組。

上手練習

接下來讓我們來進行一個簡單的實現(xiàn)過程和實驗,使大家更加深入理解如何實現(xiàn)一個前端抽簽小程序。

HTML結(jié)構(gòu)

首先,我們需要先創(chuàng)建一些基本的HTML結(jié)構(gòu),來讓用戶輸入團隊成員信息,并設(shè)定分組數(shù)量和按鈕控制器:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>分組抽簽小程序</title>
  <script src="main.js"></script>
</head>
<body>
  <h1>分組抽簽小程序</h1>
  <form id="form">
    <div>
      <label for="members">團隊成員:</label>
      <textarea id="members" name="members" placeholder="請用英文半角逗號分隔不同的成員"></textarea>
    </div>
    <div>
      <label for="groups">分組數(shù)量:</label>
      <input type="number" id="groups" name="groups" value="2" min="2">
    </div>
    <button type="submit">開始抽簽</button>
  </form>
  <div id="result"></div>
</body>
</html>

JS代碼

在JavaScript中,我們需要編寫3個函數(shù)來實現(xiàn)這個小程序:一是獲取關(guān)鍵DOM元素(getInputs),二是執(zhí)行抽簽操作并輸出結(jié)果(drawLots),三是事件監(jiān)聽邏輯(handleSubmit)。代碼如下:

// 獲取form表單輸入值的函數(shù)
function getInputs(form) {
  const members = form.members.value.trim().split(/[,\n]/).map(m => m.trim()).filter(m => m); // 轉(zhuǎn)換成數(shù)組格式,并清理空格和空白行
  const groups = +form.groups.value; // 輸入分組數(shù)量
  return { members, groups };
}
// 主要操作函數(shù)
function drawLots(members, groups) {
  const baseNum = Math.ceil(members.length / groups); // 計算每組包含多少成員
   const shuffledMembers = shuffle(members); // 將成員數(shù)組隨機排序
  let assignedCount = 0; // 計數(shù)器,記錄已分配的人數(shù)
  let result = ''; // 定義一個空字符串,用來存放抽簽結(jié)果
  let groupsRes = []; // 定義一個空數(shù)組,用來存放每個分組的成員
  // 遍歷隨機排序后的成員列表,進行分組
  shuffledMembers.forEach(member => {
    if (member.assigned) return; // 如果該成員已被分配,則跳過
    for (let i = 0; i < groups; i++) {
      const group = groupsRes[i] || []; // 如果當前分組未定義,則將其初始值設(shè)為空數(shù)組
      if (group.length < baseNum && !group.includes(member)) { // 如果該分組未滿員,并且該成員沒有被分配到其他組內(nèi)
        group.push(member); // 將該成員加入當前分組
        member.assigned = true; // 給該成員打上已分組標記
        assignedCount++; // 記錄已分配人數(shù)
        groupsRes[i] = group; // 將該分組重新賦值給原數(shù)組
        break; // 遍歷下一個成員
      }
    }
  });
  // 輸出結(jié)果
  groupsRes.forEach((group, index) => {
    result += `<h3>第${index+1}組:</h3><ul>`;
    group.forEach(member => result += `<li>${member}</li>`);
    result += `</ul>`;
  });
  document.getElementById('result').innerHTML = result; // 修改DOM節(jié)點內(nèi)容,將抽簽結(jié)果展示給用戶
}
// 監(jiān)聽表單提交事件
function handleSubmit(event) {
  event.preventDefault();
  const form = event.currentTarget;
  const { members, groups } = getInputs(form);
  if (members.length === 0) {
    alert('請輸入團隊成員!');
    return;
  }
  drawLots(members, groups);
}
document.getElementById('form').addEventListener('submit', handleSubmit); // 掛載監(jiān)聽函數(shù)

代碼中包括了淺層的代碼實現(xiàn)方法,只要牢記三個階段內(nèi)容,便可輕松完成這個小程序。

以上就是基于JavaScript開發(fā)一個有趣的分組抽簽小程序的詳細內(nèi)容,更多關(guān)于JavaScript分組抽簽程序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

彭水| 林周县| 枝江市| 佳木斯市| 浠水县| 临泉县| 蒙城县| 会宁县| 钟山县| 高淳县| 昌乐县| 镶黄旗| 永胜县| 乡城县| 西峡县| 农安县| 贡觉县| 洪雅县| 高淳县| 留坝县| 宁津县| 丘北县| 萍乡市| 温宿县| 岳池县| 淅川县| 银川市| 五原县| 神池县| 精河县| 武定县| 旺苍县| 雷波县| 神农架林区| 浑源县| 宁明县| 阳江市| 繁昌县| 保靖县| 怀柔区| 盐亭县|