javascript - 嵌套 for 循环的最佳替代方案是什么?
问题描述
我正在尝试优化这段代码,它测量空间中 2 个点的长度,如果长度合适,则画一条线。问题是它非常慢(主要在智能手机上)。有什么我可以做的让它更快吗?就像避免一些不必要的代码一样。我已经尝试了好几个星期。
this.dots.forEach(p => {
this.dots.forEach(q => {
// Using x * x instead of Math.pow for efficiency
let z = Math.sqrt((q.x - p.x) * (q.x - p.x) + (q.y - p.y) * (q.y - p.y));
if(p != q && z < this.STRING_MAX && z > this.STRING_MIN) {
// Background's oposite color
if(p.y > p5.windowHeight + 45) {
p5.stroke(0, this.transp);
} else {
p5.stroke(255, this.transp);
}
p5.line(p.x, p.y, q.x, q.y);
}
});
});
这就是它的外观(它不仅画线,这就是它变慢的原因): Neural Fuse
解决方案
首先,Math 函数可以在 if() 测试循环中完成,因为它会忽略 p == q 个项目。
但是,对于这种情况,我建议更典型的是有两个循环——外循环从 0 到倒数第二项,内循环从外循环的 counter+1 到最后一项:
for (let i = 0; i < items.length - 1; i++) {
for (let j = i + 1; j < items.length; j++) {
// check values at i and j
)
}
这样,i 和 j 将永远不会相同,并且您永远不需要为 i 的每个实例遍历整个数组。
推荐阅读
- mongodb - 无法使用 mongoose 将数组数据插入 mongodb
- c# - Xamarin - 使用 PCLStorage 镜像时 IO 操作失败
- reactjs - react-beautiful-dnd 结合了水平和垂直方向
- python - 保存使用 BeautifulSoup 获取的全部数据
- bash - 将常用命令提取到函数中
- javascript - 笑话:如何在(仅)一个单独的测试后拆解
- database - NoSQL 创建和访问不同的存储引用
- java - Java中的双引号作为字符串
- javascript - Apexcharts - React js 未处理的拒绝(TypeError):t.every 不是函数
- javascript - 使用 JavaScript 将点表示法字符串转换为数组表示法字符串