首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript:动态创建和访问对象数组

Javascript:动态创建和访问对象数组
EN

Stack Overflow用户
提问于 2018-08-05 08:35:16
回答 4查看 59关注 0票数 0

我没有机会创建和访问对象数组。我尝试在画布上随机绘制10个矩形,并将它们的X、Y、宽度和高度存储在一个数组中,以便稍后访问。

代码语言:javascript
复制
var square =  {cX : 0,  cY : 0,  W : 200,  H : 100}
var squares = [];  
var squaresToMake = 10;

for ( var loopy = 0; loopy < squaresToMake; loopy++ ) {
 square.cX = Math.floor(Math.random() * 20);
 square.cY = Math.floor(Math.random() * 20);
 square.W = Math.floor(Math.random() * 200);
 square.H = Math.floor(Math.random() * 50);
 squares.push(square);
}

var arrayLength = squares.length;
for (var loopy = 0; loopy < arrayLength; loopy++) {
 ctx.rect(squares[loopy].cX, squares[loopy].cY, squares[loopy].W, squares[loopy].H);
 ctx.fill();
}

我得到的结果是,正方形数组充满了10个对象,它们都具有相同的值:最后一个值是从分配随机数的循环中生成的。请告诉我我哪里做错了!谢谢

EN

回答 4

Stack Overflow用户

发布于 2018-08-05 08:38:00

您正在推送相同的对象(正方形)十次,因为对象是通过引用存储/传递的。每次你把新的值放入“正方形”中,你只是在更新相同的对象。将"var square“移动到循环中,这样您就可以在每个循环中创建一个新的正方形。

票数 1
EN

Stack Overflow用户

发布于 2018-08-05 08:40:20

您正在将同一对象推送到数组中。将square对象放入for循环中,以便在每次迭代时创建新的对象。目前,您只会看到指向相同引用的10个元素,其中包含一个带有最后添加的值的正方形对象。

代码语言:javascript
复制
var squares = [];  
var squaresToMake = 10;

for ( var loopy = 0; loopy < squaresToMake; loopy++ ) {
 var square =  {cX : 0,  cY : 0,  W : 200,  H : 100}
 square.cX = Math.floor(Math.random() * 20);
 square.cY = Math.floor(Math.random() * 20);
 square.W = Math.floor(Math.random() * 200);
 square.H = Math.floor(Math.random() * 50);
 squares.push(square);
}

var arrayLength = squares.length;
for (var loopy = 0; loopy < arrayLength; loopy++) {
 ctx.rect(squares[loopy].cX, squares[loopy].cY, squares[loopy].W, squares[loopy].H);
 ctx.fill();
}
票数 1
EN

Stack Overflow用户

发布于 2018-08-05 10:34:14

这样就可以满足您的要求。有时,如果不定义额外的变量,代码就不容易出错。

代码语言:javascript
复制
var squares = [];
var squaresToMake = 10;

for (var i = 0; i < squaresToMake; i++) {
  squares.push({
    cX: Math.floor(Math.random() * 20),
    cY: Math.floor(Math.random() * 20),
    W: Math.floor(Math.random() * 200),
    H: Math.floor(Math.random() * 50)
  });
}

squares.forEach(function(sq) {
  ctx.rect(sq.cX, sq.cY, sq.W, sq.H);
  ctx.fill();
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51690576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档