eliminate.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // commpents/match-achieve/eliminate.js
  2. Component({
  3. /**
  4. * 组件的属性列表
  5. */
  6. properties: {
  7. riseList: {
  8. type: Array,
  9. observer: function (val) {
  10. const data = this.computedTreeData();
  11. this.setData({ data })
  12. }
  13. },// 每组选取前x名的一维数字数组
  14. arrangeList: { type: Array }
  15. },
  16. /**
  17. * 组件的初始数据
  18. */
  19. data: {
  20. data: [],
  21. },
  22. /**
  23. * 组件的方法列表
  24. */
  25. methods: {
  26. // 计算晋级图
  27. computedTreeData() {
  28. const getWinnerNumList = this.properties.riseList; // 将每个小组取多少人收到1个纯数字的数组中
  29. const getWinnerNum = getWinnerNumList.reduce((p, n) => p + n, 0); // 小组赛选取人数: 应该是该比赛项目的 各组选取人数加和
  30. let level = 1;
  31. let loop = true;
  32. while (loop) {
  33. const needUserNum = 2 ** (level - 1);
  34. // 相等,说明已经计算出结果
  35. if (needUserNum === getWinnerNum) loop = false;
  36. // 小于,说明还可以继续往后计算
  37. else if (needUserNum < getWinnerNum) level++;
  38. else {
  39. // 大于,说明不符合淘汰赛安排,需要手动定位
  40. loop = false;
  41. level = NaN
  42. }
  43. }
  44. if (!level) {
  45. console.log('不继续,返回了,编不了数据')
  46. return;
  47. }
  48. const levelList = [];
  49. // 1:16;2:8;3:4;4:2
  50. for (let i = 0; i < level - 1; i++) {
  51. const t = level - i - 1;
  52. // 计算:该层的位置数量
  53. const number = 2 ** t;
  54. const arr = [];
  55. for (let j = 1; j <= number; j++) {
  56. const obj = { id: `${i}-${j}`, num: `${i}-${j}`, pos: [i, j] }
  57. arr.push(obj);
  58. }
  59. levelList.push(arr)
  60. }
  61. // 进行数据组合,从最少的入手,依次取回,然后将取出来的数据删除掉
  62. let getLevelIndex = levelList.length - 1;
  63. const data = this.resetData(levelList, getLevelIndex)
  64. let obj = { id: `${levelList.length}`, num: `${levelList.length}`, children: data }
  65. return obj;
  66. },
  67. resetData(dataList, index = 0) {
  68. const thisLevelList = dataList[index]
  69. // 取出2条数据
  70. const p1 = thisLevelList[0]
  71. const p2 = thisLevelList[1]
  72. // 删除取出的2条数据
  73. dataList[index].shift()
  74. dataList[index].shift()
  75. if (index - 1 < 0) return [p1, p2]
  76. const p1c = this.resetData(dataList, index - 1)
  77. const p2c = this.resetData(dataList, index - 1)
  78. p1.children = p1c
  79. p2.children = p2c;
  80. return [p1, p2]
  81. },
  82. }
  83. })