|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
厉害!
用了好多高级技巧!
js正在入门中,学习并初步解析:
先贴一下代码:
- function run(){
- const arr =Range("B2:C7").Value2.map(v => [[v[0]], [v[1].split(/、/g)]])
- const update =(x, i)=> {
- if(!(x in arr)) return arr[x] = i //标记索引
- let j = arr[x] //之前数据的索引
- if(j == i || arr[j] == null) return //是否已被处理
- arr[j].forEach((a, y) => a.forEach(v => arr[i][y].push(v))) //取得后面的时间序号和受感染者
- arr[i][1].forEach(xArr => xArr.forEach(a => arr[a] = i)) //更新状态
- arr[j] = null //清空之前的数据,做个标记
- }
- arr.reduceRight((_, v, i) => v[1].forEach(xArr => xArr.forEach(x => update(x, i))), null) //逆推求值
- const res =arr.reduce((res, v,i) => {
- v && res.push([v[0].join("、"), v[1].map(v => v.join("、")).join(";")]) //短路求值
- return res
- }, [["时间序号", "同一个传播链"]])
- Range("F16").Resize(res.length, 2).Value2 = res
- }
复制代码 经第2行代码map函数后,构造了一个新数组 arr :
- [
- [ [1],[["E","D","F"]] ],
- [ [2],[["A","B"]] ],
- [ [3],[["B","C"]] ],
- [ [4],[["N","R","P","Y"]] ],
- [ [5],[["Z","C","D"]] ],
- [ [6],[["M","P","R","X"]] ]
- ]
复制代码 第11行代码为求解,其中引用了第3行定义的 update(x,i)函数,求解后,arr 数组变为如下:
- [
- [ [1,2,3,5], [ ["E","D","F"], ["A","B"], ["B","C"], ["Z","C","D"] ] ],
- null,
- null,
- [ [4,6], [["N","R","P","Y"], ["M","P","R","X"]] ],
- null,
- null
- ]
复制代码 最后,通过第12行代码,把arr数组转换为res数组
- [
- ["时间序号", "同一个传播链"],
- ["1、2、3、5", "E、D、F;A、B;B、C;Z、C、D"],
- ["4、6", "N、R、P、Y;M、P、R、X"]
- ]
复制代码 第16行代码,把res数组写入Excel表格指定区域。
|
|