2017-02-05 7 views
3

私はNode.jsを使用して、2つの異なる言語で利用できる小さなゲームを作成しています。Array.prototype.map(コールバック、thisArg)、第2引数は無視されました

異なるのgamemodesとそれぞれの説明の翻訳リストを表示するためには、私はArray.prototype.map(callback, thisArg)を使用していますが、ノードはthisArg引数無視するように見えます:

sendMessage(translated[channel.id].modeList + modes.filter(a => { 
    if (typeof a === "string") 
     return true; 
    return false; 
}).map(translated.modeDesc, translated[channel.id]).join("\n")); 

translatedを:

const translated = { 
    "chooseLang" : "Choose a language", 
    "invalidOption" : "Invalid option", 
    "modeDesc" : mode => {return mode + " : " + "<" + modes[0][mode].join("|") + ">\n = " + this.modeDescs[mode];}, 
    "(channel id)" : global.en 
}; 

global.en

const en = { 
    "modeList" : "Here is a list of available gamemodes :", 
    "modeDescs" : { 
     "mode" : "description" 
    } 
}; 
ノードではなく translated[channel.id].modeDescsglobal.en.modeDescs)の、存在しない translated.modeDescsを、使用しようとしているように見えます

TypeError: Cannot read property 'mode' of undefined 
    at Object.ruleDesc (/home/algorythmis/Documents/Game/main.js:89:111) 
    at Array.map (native) 
    ... 

ので、ノードは本当にthisArgを無視するか、私は間違った方法によさ?私がしたい行動をとるために私は何ができますか?

ありがとうございます。

答えて

1

arrow functionを使用して、がそのようthistranslatedオブジェクトが定義したコンテキストではなく、関数への参照を保持している実際のオブジェクトを参照され保存される字句スコープ。

"modeDesc" : function(mode) {return mode + " : " + "<" + modes[0][mode].join("|") + ">\n = " + this.modeDescs[mode];} 

または明示的にコンテキストを設定するcallを使用します:

var data = translated[channel.id].modeList + modes.filter(a => { ... }); 
data = Array.prototype.map.call(translated, translated.modeDesc); 

sendMessage(data); 

は、それが動作する、MDN

+0

ええとを参照してください。定期的な機能を使用する

してみてください。私はその矢印関数の特別な動作を知らなかった、ありがとう。 – Algorythmis

関連する問題