2016-09-13 14 views
0

私が達成しようとしていることの作業コンセプトのcodepen(http://codepen.io/anon/pen/PGkQmq)を添付しました。この作業コードは、defaultNameArray内のそれぞれの位置に基づいてJSONオブジェクト内の名前キーのヌル値に名前を割り当てます。別の配列の値に基づいて配列のキーの値を設定する

私の問題は、defaultNameArrayと等しい長さのコードでdefaultObj配列を生成しようとするコードで発生します。

var defaultNameArray = ["Bob", "Alice", "Joe"]; 

var defaultObj = [ 
    { 
    "name": null, 
    "age": "32", 
    "height": "175", 
    "etc": "someData", 
    }, 
]; 

for (var i = 0; i < defaultNameArray.length -1; i++) { 
    defaultObj.push(defaultObj[0]); 
} 

for (var i = 0; i < defaultObj.length; i++) { 
    defaultObj[i].name = defaultNameArray[i]; 
    console.log("defaultObj[i].name: " + defaultObj[i].name); 
    console.log("defaultNameArray[i]" + defaultNameArray[i]); 
}; 

var str = JSON.stringify(defaultObj); 
console.log('defaultObj: ' + str); 

このコードは、私は、別の配列(名)に位置に対して、キーに値を割り当てることを反復処理することができなければならない一般的な配列を生成します。最終的な結果は、名前配列の最後の位置である "Joe"であるすべての名前です。 JSONの生成された配列を反復処理するのは、付属のcodepenのようなコードで定義されたものとは異なる動作をする理由は何ですか?

+1

をお試しください – Xotic750

+0

は、昔ながらのJavaScriptオブジェクト "JSON" を呼び出さないでください。あなたが本当に頭字語を必要とするなら、それをPOJOと呼んでください。最後に作成する文字列はJSONです。 – trincot

答えて

1

変更:あなたのケースのための十分な - そのためにあなたは浅いコピーを実行Object.assignを、使用することができますdefaultObj.push(defaultObj[0]);
これは、同じオブジェクトを配列への参照とともにプッシュするので、その中の1つのプロパティを変更すると、すべてが変更されます。そのため、最終的には最後の要素の値しか持たないのです。

[JSON](https://en.wikipedia.org/wiki/JSON)defaultObj.push(Object.assign({}, defaultObj[0]));

Object assign documentation

+0

私はこれが動作することを確認した。答えてくれてありがとう。 – Bryan

2

アレイに同じオブジェクトdefaultObj[0]を繰り返し押します。そのオブジェクトを変異させると、それをどの配列インデックスから見ても、その変更が表示されます。それは同じ、単一のオブジェクトです。 defaultObj[0].nameを変更すると、defaultObj[1].nameが変更されます。これは同じことです。

したがって、コピー(複製)する必要があります。

defaultObj.push(defaultObj[0]); 

defaultObj.push(Object.assign({}, defaultObj[0])); 

var defaultNameArray = ["Bob", "Alice", "Joe"]; 
 

 
var defaultObj = [ 
 
    { 
 
    "name": null, 
 
    "age": "32", 
 
    "height": "175", 
 
    "etc": "someData", 
 
    }, 
 
]; 
 

 
for (var i = 0; i < defaultNameArray.length -1; i++) { 
 
    defaultObj.push(Object.assign({}, defaultObj[0])); 
 
} 
 

 
for (var i = 0; i < defaultObj.length; i++) { 
 
    defaultObj[i].name = defaultNameArray[i]; 
 
    console.log("defaultObj[i].name: " + defaultObj[i].name); 
 
    console.log("defaultNameArray[i]" + defaultNameArray[i]); 
 
}; 
 

 
var str = JSON.stringify(defaultObj); 
 
console.log('defaultObj: ' + str);

+1

読書に関しては、一部の人は断るようです。 :D +1 – Xotic750

+0

@trincotあなたの説明をありがとう! +1 – Bryan

+0

ようこそ。私はあなたがそれを受け入れなかったことに少し驚き、8分後に投稿された回答のために行ったが、投票は補償する:) – trincot

関連する問題