2016-11-11 3 views
1

これまではこれまで見たことがありません。このエラーは、これを解決するために更新したNode.js 6.3.0と6.9.1 LTSの両方で発生しました。Node.js forEach:未定義のプロパティ '[オブジェクト配列]'を読み取ることができません

私はいくつかのデータに基づいてゲームの統計を構築しようとしていますが、特に重要ではありません。重要なことは、次の関数は、私のゲームのクラスの一部は、失敗したということです:

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) 

です。アレイはハードコーディングされています。何か案は?私はそれを回避することができますが、私はこの特定の構造が私が使用したいような統計を生成する最も簡単な方法であることがわかります。

+0

私はここにはエラーがない:あなたは、文字列するのではなく、文字列の配列を持つオブジェクトにインデックス付けされている別の問題を持っているよう

しかし、それが見えます。投稿をフルコードで更新できますか? – aring

+0

本当にあなたが共有している完全なコードですか?これはクロムでうまくいく...:[['home'、 'away']、['away'、 'home']] forEach((teams)=> {console。ログ(チーム)}); – Zilvinas

+0

別の通知 - あなたは2つの異なるチームバールを持っています... – Zilvinas

答えて

3

これはASIだと私は思います。 eventCounter = this.calculateEventData()の後にセミコロンを追加して、それがどのように動作するかを見てください。

詳細:http://benalman.com/news/2013/01/advice-javascript-semicolon-haters/

+0

美しい、ありがとう。私は自分の変数を書いている自分のスタイルに欠陥があると思っていますが、将来はそれを注意しなければなりません。 – nawgszy

+0

yea、おそらく ';(function(){..})()'や '; [1,2,3] .forEach..'のようなjをたくさん見たでしょう。 – jnes

1

私はあなたの問題はあなたが[['home', 'away'], ['away', 'home']]として示したものを実際に変数があることだと思います。その変数が

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 
+1

これは素晴らしい答えです。最初に1つしかなかったかもしれませんが、多分私は多分に選びました助けと明確な説明に感謝します。 – nawgszy

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; 

    //... 
} 
+0

shoutoutに感謝しますが、私はあなたが少し間違っていると信じています。 'teams'は' string'です - 'team'は' string'です。 forEach(array)=> console.log(typeof array [0]) ' - >(2)文字列 – Oka

+0

[ - ] [] []岡は言ったように、私は2次元配列を反復しているので、 'teams'はすべての点で' string 'であり、 'teams [i]'は 'string'です。私が提案したようにセミコロンを入れたところで動作します! – nawgszy

+0

ああ、そうだね –

関連する問題