- 因为 JSA 是解释执行的,所以对于长引用链的访问,使用一个变量来保存引用,然后对这个变量进行操作,会是更高效的做法
不推荐的、比较低效的做法:
ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Value2 = 789;
ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Font.Color = 255;//红色
ThisWorkbook.Worksheets.Item(1).Range('A1:C3').HorizontalAlignment = xlCenter;
提倡的、比较高效的做法:
let rng = ThisWorkbook.Worksheets.Item(1).Range('A1:C3');
rng.Value2 = 789;
rng.Font.Color = 255;//红色
rng.HorizontalAlignment = xlCenter;
学会使用箭头函数,它可以封装操作,使代码更简洁,逻辑更清晰
function ArrowFunctionClosure() {
let nums = [...new Array(5).keys()]
.map(x => [x, x ** 2, x ** 3]);
Console.log(JSON.stringify(nums));
let sumIt = index => (total, cur) => total + cur[index];
//对所有的一次方元素求和,即每个子数组的第零个元素
let sum1 = nums.reduce(sumIt(0), 0);
//对所有的二次方元素求和,即每个子数组的第一个元素
let sum2 = nums.reduce(sumIt(1), 0);
//对所有的三次方元素求和,即每个子数组的第二个元素
let sum3 = nums.reduce(sumIt(2), 0);
Console.log([sum1, sum2, sum3].join(';'));
}
学会使用数组的批处理方法(这里指的是 some/every/filter/find/reduce/map/flatMap/forEach),你的很多操作都不用写成循环,直接使用数组的内建方法就可以完成了,会极大的增强代码的紧凑度
不推荐的、比较低效的做法:
let rng = new Range('A1:C3'),
hasBoldCell = false;
for (let i = 1; i <= rng.Rows.Count; i++)
for (let j = 1; j <= rng.Columns.Count; j++)
if (rng.Cells.Item(i, j).Font.Bold) {
hasBoldCell = true;
break;
}
Console.log(hasBoldCell);
推荐的、比较高效的做法:
let rng = new Range('A1:C3');
const cellCount = rng.Cells.Count;
let indices = [...new Array(cellCount).keys()].map(x => x + 1);
let hasBoldCell = indices.some(idx =>
rng.Cells.Item(idx).Font.Bold);
Console.log(hasBoldCell);
'bcdef'.split('')
可以便捷地将要操作列索引散开成数组,然后再结合数组的批处理方法,以及声明的箭头函数,可以不用循环,就快速地完成自己的操作,代码可以非常简洁
不推荐的、比较低效的做法:
function 创建指数表() {
let sht = ActiveSheet;
sht.Cells.Clear();
const maxExponent = 4;
let baseNumbers = [...new Array(5).keys()].map(x => x + 1);
let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);
Console.log(JSON.stringify(nums));
sht.Range('A1').Value2 = '指数\\底数';
sht.Range('B1:F1').Value2 = baseNumbers;
for (i = 1; i <= maxExponent; i++) {
sht.Range(`A${i + 1}`).Value2 = i;
sht.Range(`B${i + 1}`).Value2 = nums[0][i - 1];
sht.Range(`C${i + 1}`).Value2 = nums[1][i - 1];
sht.Range(`D${i + 1}`).Value2 = nums[2][i - 1];
sht.Range(`E${i + 1}`).Value2 = nums[3][i - 1];
sht.Range(`F${i + 1}`).Value2 = nums[4][i - 1];
}
sht.UsedRange.HorizontalAlignment = xlCenter;
}
推荐的、比较高效的做法:
function 创建指数表1() {
let sht = ActiveSheet;
sht.Cells.Clear();
const maxExponent = 4;
let baseNumbers = [...new Array(5).keys()].map(x => x + 1);
let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);
Console.log(JSON.stringify(nums));
sht.Range('A1').Value2 = '指数\\底数';
sht.Range('B1:F1').Value2 = baseNumbers;
let columnLetters = 'BCDEF'.split('');
for (i = 1; i <= maxExponent; i++) {
sht.Range(`A${i + 1}`).Value2 = i;
columnLetters.forEach((columnLetter, elementIndex) =>
sht.Range(`${columnLetter}${i + 1}`).Value2 =
nums[elementIndex][i - 1]);
}
sht.UsedRange.HorizontalAlignment = xlCenter;
}