因此,我一直在思考为什么现在不能使用数小时……我想要实现的实际上是通过2D数组对行进行“传播”。基本上,将数组的第一行设置为随机值,然后将该行复制到第二行,然后第一行再次填充随机值-重复此操作,直到该行到达数组的末尾。这是一个视觉示例:
[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行之前创建一个与原始数组相等的temp数组,可以很容易地做到这一点。然后,将数组的每一行设置为temp数组的当前索引-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);
}
我知道我可以在循环中使用更多,但是现在我使用了一些单独的索引使其更加基础。
请注意console.table(arr)语句的位置-我觉得这段代码按照我编写的顺序执行,但是每个console语句都会生成相同的表,就像此外,即使我将temp设置为arr,但在以任何方式修改arr之前,都会为temp分配arr的值,然后再设置随机值。
连续循环时,这会产生并用相同的随机数填充数组,因为它依赖于临时存储未修改版本的arr ...
也许这里缺少一些明显的东西,或者我只是不知道JavaScript / p5.js的工作方式,但是任何帮助将不胜感激!
谢谢:)。
答案 0 :(得分:0)
行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();