【问题标题】:Using array.push inside of another array yields undefined在另一个数组中使用 array.push 会产生 undefined
【发布时间】:2019-01-24 21:10:23
【问题描述】:

我在尝试在 Fire 数组中定义一个数组时遇到了问题(见代码)。

我使用了 console.log() 来输出我的 Fire[] 数组中的数组长度(作为调试),但得到一个错误,指出所述数组未定义。这是我的代码:

var Fire = [];

var fire = function FireGen()
{
    this.particle = [];
    var part = function Particle()
    {
    };
    this.particle.push(part);
};
Fire.push(fire);

console.log(Fire.particle.length); //Outputs undefined

当谈到 JavaScript 中的对象和数组使用时,我还是个新手。如果有人能解释为什么我的数组未定义,我将不胜感激。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    正如其他人所指出的,Fire 是一个数组,因此要访问该数组中第一个元素的属性,您需要使用Fire[0]...。但是,您的代码还有一些其他问题需要修复。

    您的FireGenParticle 函数似乎被定义为构造函数(您在函数体中使用this)。因此,您应该使用 new 运算符调用这些函数,例如new FireGen()。进行此更改后,您可能应该重新排列代码,以便将 xy 作为参数传入,并且每个函数只定义一次。

    例如:

    var Fire = [];
    function FireGen(x, y)
    {
        this.x = x;
        this.y = y;
        this.particle = [];
        this.particle.push(new Particle(x, y));
    };
    function Particle(x, y)
    {
       this.x = x;
       this.y = y;
    };
    
    function spawnFire(event)
    {
        var x = event.clientX;
        var y = event.clientY;
        Fire.push(new FireGen(x, y));
    
        console.log(Fire[0].particle.length); //Outputs undefined
    }
    
    document.addEventListener('click', spawnFire);

    【讨论】:

      【解决方案2】:

      您正在定义永远不会执行的函数,并将这些函数推入一个数组。该数组包含一个没有particle 属性的函数。

      你可能会尝试做这样的事情:

      var Fire = [];
      
      var fire = {
        particle: [
          {
            part: { /* ... */ }
          }
        ]
      }
      
      Fire.push(fire);
      
      console.log(Fire[0].particle.length); //Outputs 1

      【讨论】:

        【解决方案3】:

        通过执行push(part)push(fire),您正在推送函数定义。

        要使它们像类一样,请使用new operator。 (即push(new part)push(new fire)

        此外,Fire 是一个数组,因此您需要指定一个索引(例如,Fire[0] 用于数组中的第一项)。

        var Fire = [];
        
        var fire = function FireGen()
        {
            this.particle = [];
            var part = function Particle()
            {
            };
            this.particle.push(new part);
        };
        Fire.push(new fire);
        
        console.log(Fire[0].particle.length);

        【讨论】:

        • @GytisDokšas 很高兴能帮上忙。也就是说,请看p.s.w.g's solution。他的实现是可扩展的,并且 - 在我个人看来 - 实现这一目标的正确方法。
        猜你喜欢
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2022-10-01
        相关资源
        最近更新 更多