Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个函数(将对象推送到数组)会使p5.js崩溃?_Javascript_Performance_P5.js - Fatal编程技术网

Javascript 为什么这个函数(将对象推送到数组)会使p5.js崩溃?

Javascript 为什么这个函数(将对象推送到数组)会使p5.js崩溃?,javascript,performance,p5.js,Javascript,Performance,P5.js,我正在构建一个进化模拟应用程序,如果某个生物体的健康度超过75%,它就会繁殖,那么健康度就会减半。为此,我创建了该对象所属类的一个新实例,然后将该对象推送到存储其他生物体的数组中。这导致p5.js崩溃的原因我不知道 我试图减少有机体的数量(3),并将其作为课堂的一个功能来写 var organisms = []; // array where organisms instances go function reproduce(){ for (let i = 0; i < organi

我正在构建一个进化模拟应用程序,如果某个生物体的健康度超过75%,它就会繁殖,那么健康度就会减半。为此,我创建了该对象所属类的一个新实例,然后将该对象推送到存储其他生物体的数组中。这导致p5.js崩溃的原因我不知道

我试图减少有机体的数量(3),并将其作为课堂的一个功能来写

var organisms = []; // array where organisms instances go

function reproduce(){
  for (let i = 0; i < organisms.length; i++){
     if(organisms[i].life > 0.75){
        // create a genetically similar size
        let size = organisms[i].size + (random() > 0.5 ? 1 : -1 * random() * 2);   
        // declare instance
        let org = new Organism(width, height, size)
        organisms.push(org);
        // prevent infinite reproduction
        organisms[i].life -= 0.5;
        }
    }
}
var=[];//数组实例的去向
函数复制(){
for(设i=0;i<0.length;i++){
if(生物体[i].生命>0.75){
//创造一个基因相似的尺寸
设大小=生物体[i]。大小+(随机()>0.5?1:-1*随机()*2);
//声明实例
let org=新生物体(宽度、高度、大小)
org;
//防止无限繁殖
生物[i].生命-=0.5;
}
}
}

我希望这只是创建新的类实例,但它会使p5.js崩溃。

您创建了一个可能永远不会结束的循环条件

for (let i = 0; i < organisms.length; i++){
for(设i=0;i<0.length;i++){

在第一次迭代中,假设生物体有5个元素。如果满足下一行的
If
条件,您将向
生物体
数组中添加另一个元素。下一次迭代将改变
生物体
中的下一个元素,但由于数组每次增加一个,您将永远不会到达数组的末尾!

遍历数组并创建新的有机体,然后在循环结束后将新创建的有机体数组添加到原始数组中

下面是一个可运行的代码段,它创建了一个最小的示例。问题中的
random
方法调用已被替换为调用
Math.random()
width
height
以消除对p5.js的需求

var有机体=[];//有机体实例所在的数组
var宽度=100;
var高度=100;
功能生物体(w、h、s){
这个宽度=w;
这个高度=h;
这个尺寸=s;
此生=0.76;
}
推(新生物体(1,1,1));
控制台.log(“繁殖前的生物体长度:+生物体.length”);
复制();
console.log(“生殖后的器官长度:“+生物体.长度”);
函数复制(){
var OrganismToAdd=[];
for(设i=0;i<0.length;i++){
if(生物体[i].生命>0.75){
//创造一个基因相似的尺寸
设size=有机体[i].size+(Math.random()>0.5?1:-1*Math.random()*2);
//声明实例
let org=新生物体(宽度、高度、大小)
组织添加推送(org);
//防止无限繁殖
生物[i].生命-=0.5;
}
}
//有机体=有机体。concat(有机体添加);
//或
生物体。推送。应用(生物体,生物体添加)

}
你在迭代数组时修改数组,这总是一个坏主意。首先创建一个新数组,然后在循环完成后将其附加到
生物体中。(如果新生物体始终具有
.life>0.75
,这将创建一个无限循环)@ChrisG Ok,在函数开始时让arr=Organics;
然后在函数结束时让arr=arr;也起作用吗.life-=0.5;不处理无限循环问题?不,
让arr=Organics;
不创建数组的副本。但是,您可以做的是将数组的长度存储在变量中,并在循环条件中使用它。这样循环将在最后一个原始元素完成。至于
.life
,初始值是多少新创建的有机体的值?@ChrisG每个有机体都以
this.life=1
开始,并且每帧
this.life-=0.01
i;因为您不断添加所有
的元素,因此会创建新元素,所以循环永远不会停止nds。无论如何,就像我说的,在进入循环之前,将长度存储在一个变量中,并使用该变量作为限制。是的,但应该有一个答案来解决问题:)我想不出这会使浏览器崩溃的原因。试着隔离导致问题的代码。让我将答案转换为可运行的代码段。将代码放入可运行的sn中ippet并将您的代码添加到其中,直到您再次出现问题。循环时出现错误,此操作正常,谢谢!