12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // commpents/match-achieve/eliminate.js
- Component({
- /**
- * 组件的属性列表
- */
- properties: {
- riseList: {
- type: Array,
- observer: function (val) {
- const data = this.computedTreeData();
- this.setData({ data })
- }
- },// 每组选取前x名的一维数字数组
- arrangeList: { type: Array }
- },
- /**
- * 组件的初始数据
- */
- data: {
- data: [],
- },
- /**
- * 组件的方法列表
- */
- methods: {
- // 计算晋级图
- computedTreeData() {
- const getWinnerNumList = this.properties.riseList; // 将每个小组取多少人收到1个纯数字的数组中
- const getWinnerNum = getWinnerNumList.reduce((p, n) => p + n, 0); // 小组赛选取人数: 应该是该比赛项目的 各组选取人数加和
- let level = 1;
- let loop = true;
- while (loop) {
- const needUserNum = 2 ** (level - 1);
- // 相等,说明已经计算出结果
- if (needUserNum === getWinnerNum) loop = false;
- // 小于,说明还可以继续往后计算
- else if (needUserNum < getWinnerNum) level++;
- else {
- // 大于,说明不符合淘汰赛安排,需要手动定位
- loop = false;
- level = NaN
- }
- }
- if (!level) {
- console.log('不继续,返回了,编不了数据')
- return;
- }
- const levelList = [];
- // 1:16;2:8;3:4;4:2
- for (let i = 0; i < level - 1; i++) {
- const t = level - i - 1;
- // 计算:该层的位置数量
- const number = 2 ** t;
- const arr = [];
- for (let j = 1; j <= number; j++) {
- const obj = { id: `${i}-${j}`, num: `${i}-${j}`, pos: [i, j] }
- arr.push(obj);
- }
- levelList.push(arr)
- }
- // 进行数据组合,从最少的入手,依次取回,然后将取出来的数据删除掉
- let getLevelIndex = levelList.length - 1;
- const data = this.resetData(levelList, getLevelIndex)
- let obj = { id: `${levelList.length}`, num: `${levelList.length}`, children: data }
- return obj;
- },
- resetData(dataList, index = 0) {
- const thisLevelList = dataList[index]
- // 取出2条数据
- const p1 = thisLevelList[0]
- const p2 = thisLevelList[1]
- // 删除取出的2条数据
- dataList[index].shift()
- dataList[index].shift()
- if (index - 1 < 0) return [p1, p2]
- const p1c = this.resetData(dataList, index - 1)
- const p2c = this.resetData(dataList, index - 1)
- p1.children = p1c
- p2.children = p2c;
- return [p1, p2]
- },
- }
- })
|