2016-04-28 9 views
0

私は即座に説明することはできませんし、したいと思わない問題に遭遇しました。次のコードを書くと返品時にマップが未定義

this.metadata = json.metadata.map((x) => {return new Metadatum(x);}); 
console.log(this.metadata[0].value); 

出力はjson.metadataのすべての要素で '未定義'です。 、私は次のよう記述する場合

json.metadata.map(x => this.metadata.push(new Metadatum(x))); 
console.log(this.metadata[0].value); 

は、今私は正しい結果を得る(マップ機能の悪い使用を、私はちょうどここのforEachを書くことができ知っているとの結果が同じである)、未定義ではありません。

this.metadata(Metadatum [])の割り当てが定義されていないのはなぜですか?

+0

それは 'this.metadata'はすでに前に有効な値を持っており、あなたの第二の方法がうまくいかないのいずれかが、あなたが以前の要素をクリアしていないので、あなたがそれを見ていないということだろう新しいものを押す前に? – CherryDT

+0

@CherryDT this.metadataは、基本的にはそれ以上の配列として宣言されました。 (メタデータ:Metadatum []) –

答えて

0

あなたは.mapを使用するには、以下のオプションのいずれかを使用できます。ES6ラムダの構文の

var data = [1, 2,3,4,5,6,7]; 
function Metadatum (x) { 
    this.value = x; 
} 

let metadata = data.map((x) => { return new Metadatum(x); }); 
let metadata1 = data.map(x => new Metadatum(x)); 
console.log(metadata[0].value); 
console.log(metadata1[0].value); 

一部は以下の通りです:

(param1, param2, …, paramN) => { statements } 
(param1, param2, …, paramN) => expression 
    // equivalent to: => { return expression; } 

// Parentheses are optional when there's only one parameter: 
(singleParam) => { statements } 

singleParam => {文}

// A function with no parameters requires parentheses: 
() => { statements } 

矢印機能の詳細な構文については、を参照してください。

編集:ここでは実施例とJSBinリンクです:https://jsbin.com/huzuyo/1/edit?html,js,console

+0

私はこれを認識していますが、その構文を使用すると値は未定義です。私はそれを直接配列にプッシュすることができ、それは未定義ではありません –

+0

これを示すためにJSBin、codepenまたはplunkrを作成できますか?私は自分の答えを編集し、JSBinリンクを追加しました –

0

あなたのデータ構造をチェックする必要があります。 .mapは配列を取得し、新しい配列を返します。 チェックアウトこの例:

var kvArray = [ 
    {key:1, value:10}, 
    {key:2, value:20}, 
    {key:3, value: 30} 
]; 

var reformattedArray = kvArray.map(function(obj){ 
    var rObj = {}; 
    rObj[obj.key] = obj.value; 
    return rObj; 
}); 
関連する問題