使用以下代码,我遍历颜色数组(favorites
),为jsPDF
文档创建矩形。
经过5次迭代,我想将x
变量重置为startX
,然后在每次迭代中添加1.875。同样,在接下来的5次迭代中:将x
重置为startX
,将1.875增加到10,然后再次直到15。
在这些条件中,我只是没有运气来重置x
。我敢肯定这很明显,但是我在这里想念的是什么?
还是应该以其他方式构造循环?
我要完成的任务是创建5矩形的3行。一旦打到5,就开始新的一行,因此将x
重置为页面位置坐标。
let startX = 1
let startY = 1
let secondY = 4
let thirdY = 6.5
let n = favorites.length
for (let i = 0, x = startX, y = startY; i < n; x += 1.875, i++) {
if (i < 5) {
doc.setFillColor(favorites[i].h)
doc.rect(x, y, 1.5, 1, 'F')
doc.text(favorites[i].h.toString(), x, y + 1.5)
} else if (i >= 5 && i < 10) {
x = 1 // resets but then doesn't increment
y = secondY
doc.setFillColor(favorites[i].h)
doc.rect(x, y, 1.5, 1, 'F')
doc.text(favorites[i].h.toString(), x, y + 1.5)
} else if (i >= 10 && i < 15) {
x = 1 // resets but then doesn't increment
y = thirdY
doc.setFillColor(favorites[i].h)
doc.rect(x, y, 1.5, 1, 'F')
doc.text(favorites[i].h.toString(), x, y + 1.5)
}
}
答案 0 :(得分:3)
您可以使用模运算符(%
),并在循环声明之外设置x和y:
const yValues = [1, 4, 6.5];
for (let i = 0 ; i < 15; i++) {
const x = 1 + ((i%5) * 1.875);
const y = yValues[Math.floor(i/5)];
// commented lines to make this example run
// doc.setFillColor(favorites[i].h)
// doc.rect(x, y, 1.5, 1, 'F')
// doc.text(favorites[i].h.toString(), x, y + 1.5)
console.log({x,y});
}
答案 1 :(得分:2)
for
循环中的递增发生在循环中的任何命令之前。现在,第二个和第三个if
块中的每次迭代都会将x
重置为1,并且在{em }}循环,从而覆盖它。这就是x
不变的原因。
更好的方法可能是仅增加for
,然后将x
设置为取决于i
的值,如下所示:
x
实际上,最好使用i
代替1:
x = 1 + ((i - 5) * 1.875)
x = 1 + ((i - 10) * 1.875)