Node.js forEach:无法读取未定义

时间:2016-11-11 01:32:34

标签: javascript arrays node.js foreach

我以前从未见过这个。这个错误发生在Node.js 6.3.0和6.9.1 LTS上,为了解决这个问题,我更新了这个错误。

我正在尝试根据我拥有的某些数据为游戏制作统计数据,而不是特别重要。重要的是,以下函数(我的Game类的一部分)失败了:

computeStats() {
  var stats
    , roster
    , team, opp, scoreState, oppScoreState
    , TOI = this.calculateTOIData()
    , eventCounter = this.calculateEventData()

  [['home', 'away'], ['away', 'home']].forEach((teams) => { //this is line 74 / error source
    team = teams[0];
    opp = teams[1];

    roster = this[team].roster;

    stats = {
      //some assignments occur here from my TOI and eventCounter objects
    }

    this.setStats(team, stats);
  })
}

抛出的错误是

TypeError: Cannot read property '[object Array]' of undefined
    at GameTracker.computeStats (/Users/nawgszy/repo/lib/Game.js:74:5)
    at new GameTracker (/Users/nawgszy/repo/lib/Game.js:39:10)

我不知道这是怎么回事。阵列是硬编码的,就在那里。有任何想法吗?我可以解决它,但我发现这个特定的结构是生成我想要使用的统计数据的最简单方法。

4 个答案:

答案 0 :(得分:3)

我想,ASI正在弄乱你。在eventCounter = this.calculateEventData()之后添加一个分号,看看它是如何运行的。

更多信息:http://benalman.com/news/2013/01/advice-javascript-semicolon-haters/

答案 1 :(得分:2)

this.calculateEventData()后丢失的分号 导致以下括号表示法作为下标访问,而不是就地数组表示法。

代码读作:

var eventCounter = (this.calculateEventData()[['home', 'away'], ['away', 'home']]).forEach((teams) => { ... });

请注意我添加的括号。 comma operator导致['away', 'home']成为下标,通过Object.prototype.toString()传递,成为'[object Array]'

this.calculateEventData()返回undefined。这些陈述变为undefined['[object Array]']

基本上,使用分号,也许可以避免使用内联数组(或者用分号作为前缀,因为这是安全的。)

var stats
   , roster
   , team, opp, scoreState, oppScoreState
   , TOI = this.calculateTOIData()
   , eventCounter = this.calculateEventData(); // <-- Right there.

最小复制:

// test.js
const func = () => {};

const result = func()
[[]].forEach(() => {});

使用Node.js运行在browser中也会失败。

$ node -v
v6.5.0
$ node test.js
/home/foo/test.js:4
[[]].forEach(() => {});
^

TypeError: Cannot read property '[object Array]' of undefined
    at Object.<anonymous> (/home/foo/test.js:4:1)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3

答案 2 :(得分:1)

我认为你的问题是你所展示的[['home', 'away'], ['away', 'home']]实际上是一个变量;并且该变量未定义(可能是错误的或未声明的)

答案 3 :(得分:0)

我认为@Oka已经解决了你所看到的错误。

但是,看起来还有另一个问题,即使用字符串数组而不是字符串索引到对象:

(teams) => {
    // teams: string[][];

    team = teams[0];    // team: string[];
    opp = teams[1];     // opp: string[];

    // Issue here: Trying to index `this[team]` with a string array, not a string value.
    roster = this[team].roster;

    //...
}