为什么Array.apply()安装会导致未定义索引?

时间:2019-06-01 22:55:39

标签: javascript arrays

在构造函数中,我正在创建一个二维数组,如下所示:

jQuery(function ($, undefined) {
    $('body').terminal({
        register: function (email, user, pw) {
            this.echo("register...")
            jQuery.ajax({
                url: "https://faf3fg.execute-api.us-west-2.amazonaws.com/api/register/" + email +
                    '/' + user + '/' + pw,
                crossDomain: true,
                success: function (result) {
                    this.echo(data);
                    console.log(data);
                },
                async: false
            });
        }
    },{
        greetings: 'say',
        name: 'sterm',
        height: $('body').height(),
        width: $('body').width(),
        prompt: 'sss> ',
        completion: true
    });
});

在我this.grid = Array.apply(null, Array(3)).map((el, i) => { return Array.apply(null, Array(3)).map((el, i) => { return { key1: null, key2: null }; }); }); 之后,我得到一个包含对象和null属性的二维数组。但是,如果我尝试console.log(this.grid),在console.log(JSON.stringify(this.grid[0][1]))上会有未定义的错误

[1]

我了解使用构造函数构造数组与使用Array.apply()之间的一些区别。也许我使用的apply()不正确?

我试图以多种方式构造此数组。从嵌套的for循环中,其中class Grid { constructor() { this.grid = Array.apply(null, Array(3)).map((el, i) => { return Array.apply(null, Array(3)).map((el, i) => { return { key1: null, key2: null }; }); }); } } // used in another external class with require() and instantiated like: let grid = new Grid(); console.log(grid); console.log(JSON.stringify(grid[0][1]))将相同的对象指向第二维,然后每行排列一次网格。

.push()

this.grid = []
    for(let i = 0; i < 3; ++i){
      let row = []
      for( let j =0; j< 3; ++j) {
        let obj = {
          key1: "property",
          key2: "property"
        }
        row.push(obj);
      }
      this.grid.push(row);
    }

我希望日志在相应的索引处显示对象。但是,class Grid { constructor() { this.grid = []; for (let i = 0; i < 3; ++i) { let row = []; for (let j = 0; j < 3; ++j) { let obj = { key1: null, key2: null }; row.push(obj); } this.grid.push(row); } } } // used in another external class file with a require() and instantiation like so: let grid = new Grid(); console.log(JSON.stringify(grid[0][1]));仍然是:

JSON.stringify(this.grid[0][1])

1 个答案:

答案 0 :(得分:2)

名为grid的变量具有名为grid属性,它是包含内部数组的外部数组。因此,要引用内部数组,请访问grid.grid。否则,仅引用grid即可为您提供实例,而不是外部数组。

class Grid {
  constructor() {
    this.grid = Array.apply(null, Array(3)).map((el, i) => {
      return Array.apply(null, Array(3)).map((el, i) => {
        return {
          key1: null,
          key2: null
        };
      });
    });
  }
}
// used in another external class with require() and instantiated like:
let grid = new Grid();

console.log(JSON.stringify(grid.grid[0][1]))

如果实例上有一个方法(例如printGrid可以打印网格),则可能会更清楚。然后,有意义的是,您将调用grid.printGrid来打印网格,并且将引用grid.grid来访问外部数组(而grid本身显然只是实例)。

为减少这种混乱,您可以考虑使用其他属性名称,例如outerArray(或其他类名称)。

class Grid {
  constructor() {
    this.outerArray = Array.apply(null, Array(3)).map((el, i) => {
      return Array.apply(null, Array(3)).map((el, i) => {
        return {
          key1: null,
          key2: null
        };
      });
    });
  }
}
const gridInstance = new Grid();

console.log(JSON.stringify(gridInstance.outerArray[0][1]))