如何遍历类对象数组并在 JavaScript 中使用函数 [重复]

Posted

技术标签:

【中文标题】如何遍历类对象数组并在 JavaScript 中使用函数 [重复]【英文标题】:How to Iterate through an Array of Class Objects and use functions in JavaScripts [duplicate] 【发布时间】:2019-11-14 15:00:10 【问题描述】:

我想遍历一个对象数组并使用数组中对象中的一个函数。我来自JAVA,这样做很正常。出于这个原因,我猜它也适用于 JS,但我不确定如何。

我的代码如下所示:

class Whateever 

constructor(ctx)
   this.ctx
   this.shotsFired = [];


onButtonPush()
        let shot = new Shot(this.position.x, this.position.y);
        this.shotsFired.push(shot);


//called every frame
update()
       for (let shot in this.shotsFired) 
                shot.update();  <-- I want to call this function
                shot.draw(this.ctx); <-- and that function
            

--

class shoot
    constructor(x,y)
       this.position = 
            x : x,
            y : y
        ;
  

update()
// Do nothing 


draw(ctx)
// do nothing



但是有了这个结构,我总是得到错误信息:

Whateever.js:40 Uncaught TypeError: shot.draw is not a function
    at Whateever.update (ship.js:40) 
    at gameLoop (index.js:23)

shot.update() 函数自己工作。

我只想知道如何通过数组中的循环调用对象函数?

这是一个大班的简单片段。如果我要发布整个班级,那将是混乱的。问题绝对清楚!

对象数组 -> 迭代 -> 在迭代期间从对象调用函数。

如果您需要一个示例,我可以发布 JAVA 代码以明确我的意思。

【问题讨论】:

你需要确保onButtonPush方法首先被执行。用new Shot 实例填充数组 你的Shot类真的有draw()函数吗?无论如何 - 清楚地表明问题的代码的工作示例会更有帮助。 Array 有一个 forEach 方法来循环遍历它 请添加镜头类 @akinjide - 如果未调用 onButtonPush(),则shotsFired 只是一个空数组,因此它永远不会尝试在 Shot 实例上调用 draw() 或 update()。跨度> 【参考方案1】:

为了遍历数组,您可以使用for...of:

let array = [a:1, b:2, c:3];

for (let item of array) 
  console.log(item);

因此,对于您的特定示例,它将是:

update() 
  for (let shot of this.shotsFired) 
    shot.update();
    shot.draw(this.ctx);
  

甚至更简单:

update() 
  this.shotsFired.forEach(shot => 
    shot.update();
    shot.draw(this.ctx);
  );

【讨论】:

@RedDeadRabbit The Problem is not to go throug the array. 有点像,因为for (a in b)keys 放入 a,而不是值。请改用of,它会立即生效。 谢谢! “in”和“of”之间有什么大的不同【参考方案2】:

使用时

for (let shot in this.shotsFired)  
   shot.update(); <-- I want to call this function 
   shot.draw(this.ctx); <-- and that function 

for 循环实际上是在迭代键,所以你应该执行以下操作

for (let shot in this.shotsFired)  
   this.shotsFired[shot].update(); <-- I want to call this function 
   this.shotsFired[shot].draw(this.ctx); <-- and that function 

但最终你不应该使用这种技术迭代数组

或者,您可以使用许多其他可用的迭代选项,例如 forEach 或 for of

【讨论】:

以上是关于如何遍历类对象数组并在 JavaScript 中使用函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历多维数组以生成新数据并在节点 js / javascript 中追加新的键值

循环遍历 JavaScript 对象数组并删除值

[Javascript]类数组对象为什么不能用for in进行遍历

尝试遍历两个数组并在 JavaScript 中正确格式化它们的输出

arcgis api for javascript如何遍历graphics

JavaScript之jQuery-6 jQuery 类数组的操作