iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
Vue.js

遊戲活動關卡查詢網站系列 第 16

遊戲活動關卡查詢網站Day16-敵人資訊2(JSON架構轉換)

  • 分享至 

  • xImage
  •  

目標
在將資料套至Template之前
需要對資料做些過濾與處理
這篇會針對我們需要的畫面結構
做資料處已的設計

步驟
1.
先看一下之前做的線稿
敵人資訊這邊要顯示的畫面
我們需要的資料結構會有以下需求
●資料會先依stageOrder分組(關卡序號分組)
●每關裡又會有數個敵人,以敵人資訊分類(rrn編號分組)
●敵人裡又會有不同行動模式(skill分組)

而原本從Supabase拿過來的資料
架構會長這樣 以下是兩筆範例資料

[
  {
    "stageorder": "01",
    "actionname": "黃昏無夢者",
    "eventname": "黄昏メアレスRe後編",
    "element": "火",
    "species": "魔族",
    "hp": "5000000",
    "angercondition": "場上減員",
    "skillorder": 1,
    "rrn": "000000000501011",
    "skillflag": "一般行動",
    "skill1name": "AD計量條減少"
  },
  {
    "stageorder": "02",
    "actionname": "黃昏無夢者",
    "eventname": "黄昏メアレスRe後編",
    "element": "火",
    "species": "魔族",
    "hp": "5000000",
    "angercondition": "場上減員",
    "skillorder": 2,
    "rrn": "000000000501011",
    "skillflag": "一般行動",
    "skill1name": "一般攻擊"
  }
]

其實上面這樣格式的資料
就是我們在DB查詢時,看到的數個Row的資料
它屬於一維陣列 可以在這邊按下Export->Copy As JSON查看

第一行是第一筆資料,第二行是第二筆資料

我們的需求是
要讓它變成下面這樣的架構

[
  {
    "stageOrder": "01",
    "enemyInfo": [
      {
        "rrn": "000000000501011",
        "element": "火",
        "species": "魔族",
        "hp": "5000000",
        "skill": [
          { "skillFlag": "一般行動", "skillInfo": ["AD計量條減少30","一般攻擊1500"] },
          { "skillFlag": "先制行動", "skillInfo": [] },
          { "skillFlag": "死亡行動", "skillInfo": [] },
          { "skillFlag": "憤怒後先制行動", "skillInfo": [] },
          { "skillFlag": "憤怒後一般行動", "skillInfo": ["亡者的怨念1500+敵方減員數*3000"] },
          { "skillFlag": "憤怒後死亡行動", "skillInfo": [] }
        ]
      },
      {
        "rrn": "000000000501012",
        "element": "雷",
        "species": "魔族",
        "hp": "5000000",
        "skill": [
          { "skillFlag": "一般行動", "skillInfo": ["AS特殊變化3秒以上(傷害減少500)\n4秒以上(複屬性封印)\n5秒以上(C數減少10)\n7秒以上(自傷20)","一般攻擊1500","亡者的怨念1500+敵方減員數*3000"] },
          { "skillFlag": "先制行動", "skillInfo": [] },
          { "skillFlag": "死亡行動", "skillInfo": [] },
          { "skillFlag": "憤怒後先制行動", "skillInfo": [] },
          { "skillFlag": "憤怒後一般行動", "skillInfo": [] },
          { "skillFlag": "憤怒後死亡行動", "skillInfo": [] }
        ]
      }
    ]
  },
  {
    "stageOrder": "02",
    "enemyInfo": [
      {
        "rrn": null,
        "element": "闇",
        "species": "魔族",
        "hp": "10000000",
        "skill": [
          { "skillFlag": "一般行動", "skillInfo": [] },
          { "skillFlag": "先制行動", "skillInfo": [] },
          { "skillFlag": "死亡行動", "skillInfo": [] },
          { "skillFlag": "憤怒後先制行動", "skillInfo": [] },
          { "skillFlag": "憤怒後一般行動", "skillInfo": [] },
          { "skillFlag": "憤怒後死亡行動", "skillInfo": [] }
        ]
      }
    ]
  }
]

所以在A組件這邊先寫一個computed屬性
內部來做處理
將Supabase取得資料的格式做轉換

<script setup>
const stageList = computed(() => {

	const skillFlags = [
		"一般行動",
		"先制行動",
		"死亡行動",
		"憤怒後先制行動",
		"憤怒後一般行動",
		"憤怒後死亡行動"
	];

	// 用 stageOrder 分組
	const stageMap = {};

	result.value.forEach(item => {
	const stage = item.stageorder;
	if (!stage) return;

	if (!stageMap[stage]) {
		stageMap[stage] = {};
	}

	const rrn = item.rrn || "NO_RRN_" + Math.random(); // 處理 null rrn
	if (!stageMap[stage][rrn]) {
		stageMap[stage][rrn] = {
			rrn: item.rrn,
			element: item.element,
			species: item.species,
			hp: item.hp,
			skill: skillFlags.map(flag => ({ skillFlag: flag, skillInfo: [] }))
		};
	}

	if (item.skillflag && item.skill1name) {
		const skillEntry = stageMap[stage][rrn].skill.find(s => s.skillFlag === item.skillflag);
		if (skillEntry) {
			skillEntry.skillInfo.push(
			`${item.skill1name}${item.skill1value ? item.skill1value : ""}`
			);
		}
	}
	});

	return Object.keys(stageMap)
	.sort((a, b) => a.localeCompare(b)) 
	.map(stage => ({
	stageOrder: stage,
	enemyInfo: Object.values(stageMap[stage])
		.sort((a, b) => {
		// 處理 rrn 為 null 的情況
		const rrnA = a.rrn || "";
		const rrnB = b.rrn || "";
		return rrnA.localeCompare(rrnB);
		})
	}));

})
</script>

轉換後的資料stageList 可以印在Template上看一下
然後把這些資料放在JSON Editor上面檢視
左側貼上資料後,按下箭頭,就會幫你排好架構
右側就是我們要的JSON資料格式
到了這一步,最麻煩的資料處理已經告一段落
接下來,我們就能開始寫Template把這些JSON資料套進來就好了

備註
1.
查看JSON架構時
也可以使用其他方便看JSON架構的工具

關於資料的轉換方式有很多種
如果有更好的方法,請在底下留言讓我知道


上一篇
遊戲活動關卡查詢網站Day15-敵人資訊1(Vue:Watch)
下一篇
遊戲活動關卡查詢網站Day17-敵人資訊3(Vue:v-if)
系列文
遊戲活動關卡查詢網站23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言