|
既然数组 p 已经兼任字典了,索性在数组 p 中再增加一个字典取代原来的字典 dic- function testA(){
- let data = Sheets('区').Range('a2').CurrentRegion().slice(1);
- let res = data.reduce((p, [sn, name, type, count], row) => {
- let col = count + 1, colDic = type + col;
- p[0][col] ??= count; //优化了冗余赋值
- row = p[colDic] ??= (p[type] ??= p.push([type]) - 1); //p[colDic]、p[type],由数组 p 兼任的2个字典
- (p[row] ??= [type])[col] = sn + name;
- return p[colDic]++, p;
- }, [['类别']])
- let sht = Sheets('区三维');
- sht.UsedRange.Clear();
- sht.Range('a1').Resize(res.length, res[0].length).Value2 = res;
- sht.UsedRange.Columns(1).RangeEx.MergeSame();
- sht.UsedRange.Borders.LineStyle = xlContinuous;
- }
复制代码
上次的代码是:
- function test(){//本方法为直接写数组元素法
- let data = Sheets('区').Range('a2').CurrentRegion().slice(1)//原始数据已按类型排序,就不写排序了
- let startRow, dic//定义2个变量,每一种类型起始行,记录类别初始行号的字典
- let linkcells = []
- let res = data.reduce((p,[sn,name,type,count],i) => {
- let col = count + 1 //要写入的列
- p[0][col] = count //写入列标题
- /*下行代码的作用是,首次扫描到类别 type 时:
- 1、字典 dic 赋初值 {},记录列号对应的行号
- 2、把类别 type 压入数组 p 的新行
- 3、把该类的初始行号,赋值给p[type],即数组p又兼任字典,同时,初始行号赋值给startRow*/
- let startRow = p[type] ??= (dic = {}, p.push([type]) - 1)
- let row = dic[col] ??= startRow; //dic[col]赋初值startRow,dic记录的是col对应的row
- /*圆括号中的表达式含义是:数组p的row行不存在,type压入新行,否则保持原来的p[row]
- (p[row] ??= [type]) 结果是 p[row],后面跟[col],最终左侧就是 p[row][col],接着就是赋值*/
- (p[row] ??= [type])[col] = sn + name;
- return dic[col]++, p; //dic[col]自加1,表示下次col列的行号是新的一行,最后返回数组p
- },[['类别']])//结果初始值就一个单元格
- let sht = Sheets('区三维')
- sht.UsedRange.Clear()
- sht.Range('a1').Resize(res.length , res[0].length).Value2 = res
- sht.UsedRange.Columns(1).RangeEx.MergeSame()
- sht.UsedRange.Borders.LineStyle = xlContinuous
- }
复制代码
代码确实更简练了,不过也更难看懂了
|
评分
-
1
查看全部评分
-
|