P5.js draw() 函数以错误的顺序执行 For 循环
P5.js draw() Function Executing For-Loops in Wrong Order
所以我一直在绞尽脑汁思考为什么这几个小时都不起作用......我想要实现的实际上是 "propagation" 行通过二维数组。基本上,数组的第一行设置为随机值,然后将该行复制到第二行,第一行再次填充随机值 - 重复此操作直到该行到达数组的末尾。这是一个视觉示例:
[0, 0, 0]
[1, 1, 1]
[2, 2, 2]
|
[3, 7, 2]
[0, 0, 0]
[1, 1, 1]
|
[5, 6, 8]
[3, 7, 2]
[0, 0, 0]
|
And so on...
我可以在 Python 中很容易地做到这一点,方法是在将新值注入第 0 行之前创建一个与原始数组相等的临时数组。然后,数组的每一行都设置为临时数组的当前索引 1,有效地将每一行向上移动一位。
但是,在 JavaScript 中,特别是 p5js,我似乎根本无法让它工作。在 draw() 函数中执行 for 循环时,就好像一切都是异步完成的,或者没有按照我期望的顺序执行。这是我的代码:
var arr = [], temp = [];
function setup() {
noLoop();
arr[0] = [0,0,0];
arr[1] = [1,1,1];
arr[2] = [2,2,2];
}
function draw(){
for(let k = 0; k < 3; k++){
temp[k] = arr[k];
}
console.table(arr);
for(let i = 0; i < 3; i++){
arr[0][i] = random(10)
}
console.table(arr);
arr[1] = temp[0];
arr[2] = temp[1];
console.table(arr);
}
我知道我可以使用更多的 for 循环,但是我现在使用了一些单独的索引以使其更基本。
注意 console.table(arr) 语句的位置 - 我的印象是这段代码按照我编写的顺序执行,但是 每个控制台语句都会产生相同的 table,就好像在向控制台写入任何内容之前所有代码都是 运行。 此外,即使我在以任何方式修改 arr 之前将 temp 设置为 arr,在设置随机值之后,temp 将被分配 arr 的值。
当连续循环时,这会产生和填充相同随机数的数组,因为它依赖于临时存储 arr 的未修改版本...
也许我遗漏了一些明显的东西,或者我只是不知道 JavaScript/p5.js 是如何工作的,但我们将不胜感激任何帮助!
谢谢 :).
行 temp[k] = arr[k];
通过引用复制数组对象,这意味着修改其中一个子数组会修改另一个,因此 arr[0][i] = random(10)
修改两个数组中的内容。这可以通过首先执行 arr[0] = [];
来解决。 (如果我没记错的话,这和Python中的是一样的)
在常规 JS 中,console.log
与其他日志功能一起,不会立即获取对象的内容,而是获取需要显示的部分,有效地只显示最后的状态的对象。 chrome devtools 应该显示一个关于那个的小注释警告。
完成整个操作的更好、更有效的方法是
let temp = [];
for (let i = 0; i < 3; i++) temp.push(random(10));
arr.unshift(temp);
arr.pop();
所以我一直在绞尽脑汁思考为什么这几个小时都不起作用......我想要实现的实际上是 "propagation" 行通过二维数组。基本上,数组的第一行设置为随机值,然后将该行复制到第二行,第一行再次填充随机值 - 重复此操作直到该行到达数组的末尾。这是一个视觉示例:
[0, 0, 0]
[1, 1, 1]
[2, 2, 2]
|
[3, 7, 2]
[0, 0, 0]
[1, 1, 1]
|
[5, 6, 8]
[3, 7, 2]
[0, 0, 0]
|
And so on...
我可以在 Python 中很容易地做到这一点,方法是在将新值注入第 0 行之前创建一个与原始数组相等的临时数组。然后,数组的每一行都设置为临时数组的当前索引 1,有效地将每一行向上移动一位。
但是,在 JavaScript 中,特别是 p5js,我似乎根本无法让它工作。在 draw() 函数中执行 for 循环时,就好像一切都是异步完成的,或者没有按照我期望的顺序执行。这是我的代码:
var arr = [], temp = [];
function setup() {
noLoop();
arr[0] = [0,0,0];
arr[1] = [1,1,1];
arr[2] = [2,2,2];
}
function draw(){
for(let k = 0; k < 3; k++){
temp[k] = arr[k];
}
console.table(arr);
for(let i = 0; i < 3; i++){
arr[0][i] = random(10)
}
console.table(arr);
arr[1] = temp[0];
arr[2] = temp[1];
console.table(arr);
}
我知道我可以使用更多的 for 循环,但是我现在使用了一些单独的索引以使其更基本。
注意 console.table(arr) 语句的位置 - 我的印象是这段代码按照我编写的顺序执行,但是 每个控制台语句都会产生相同的 table,就好像在向控制台写入任何内容之前所有代码都是 运行。 此外,即使我在以任何方式修改 arr 之前将 temp 设置为 arr,在设置随机值之后,temp 将被分配 arr 的值。
当连续循环时,这会产生和填充相同随机数的数组,因为它依赖于临时存储 arr 的未修改版本...
也许我遗漏了一些明显的东西,或者我只是不知道 JavaScript/p5.js 是如何工作的,但我们将不胜感激任何帮助!
谢谢 :).
行 temp[k] = arr[k];
通过引用复制数组对象,这意味着修改其中一个子数组会修改另一个,因此 arr[0][i] = random(10)
修改两个数组中的内容。这可以通过首先执行 arr[0] = [];
来解决。 (如果我没记错的话,这和Python中的是一样的)
在常规 JS 中,console.log
与其他日志功能一起,不会立即获取对象的内容,而是获取需要显示的部分,有效地只显示最后的状态的对象。 chrome devtools 应该显示一个关于那个的小注释警告。
完成整个操作的更好、更有效的方法是
let temp = [];
for (let i = 0; i < 3; i++) temp.push(random(10));
arr.unshift(temp);
arr.pop();