2017-04-19 16 views
0

のための問題を使用しながら、重複します:はJavaScript - 子要素をループ

私は子要素を取得して喜んであなたは上の明確なアイデアを持ってするには、以下のJSON配列で見ても(optionNameと呼ばれます何が起こっているか)、それは私にそれを得るためにネストされたforループが必要です。これまでのところ、私は得ることができます。しかし、私が次のようにしている間に、その子要素の値を変数(コードセクションの5行目)に代入しようとすると、問題が発生します。 i.optionNameの値を順序付けします。要するに

Meal : Big Mac 
Options : 
Normal Ou Maxi ? : Maxi 
Choix du boisson : Fanta Orange 
Choix des frites : Frites steak house 
Category : Menus 
Qty : 1 
Price : 49 

Meal : Chicken McNuggets X6 
Options : 
//The first block is repeated again which is normal as I used additions +=** 
Normal OR Big ? : Big 
Choix du boisson : Fanta Orange 
Choix des frites : Steak house 

Normal OR Big ? : Normal 
Choix du boisson : Sprite 
Choix des frites : Steak house** 
Category : Menus 
Qty : 1 
Price : 45 

親要素として多くがそれ以上のものとして、それが悪化しています:)配列と同様に、子要素は、以下が表示されますされ蓄積されます。私はなぜそれをやっているのか言うかもしれませんが、その答えは以下の変数dishesがこの特別な場合に文字列でなければならないためです!

現在のコード:

let dishes = ''; 
    let additions = ''; 

    var msg = MessageContent.orderedDishes.forEach(function(element) { 
     for(var i of element.selectedAdditions){ 
     additions += i.optionName + 
     ' : ' 
     + i.Name + '\n'; 
    } 

    dishes += 
     'Meal : ' + element.dishName + '\n' + 
     'Options : \n' + additions + '\n' + 
     'Category : ' + element.categoryName + '\n' + 
     'Qty : ' + element.qty+ '\n' + 
     'Price : ' + element.price + '\n\n'; 
}); 

ここでは、私が反復処理しようとしていますJSON配列さ:

[{ 
"objectId": "Kakao0MiRE", 
"price": 49, 
"dishName": "Big Mac", 
"categoryName": "Menus", 
"selectedAdditions": [{ 
    "optionName": "Normal Ou Big ?", 
    "Name": "Big", 
    "Price": 5 
}, { 
    "optionName": "Drink", 
    "Name": "Fanta Orange", 
    "Price": 0 
}, { 
    "optionName": "Fries", 
    "Name": "Steak house", 
    "Price": 0 
}], 
"additionalPrice": 5, 
"qty": 1 
}, { 
"objectId": "kOP90Ld8b9", 
"price": 45, 
"dishName": "Chicken McNuggets X6", 
"categoryName": "Menus", 
"selectedAdditions": [{ 
    "optionName": "Normal Ou Maxi ?", 
    "Name": "Normal", 
    "Price": 0 
}, { 
    "optionName": "Drink", 
    "Name": "Sprite", 
    "Price": 0 
}, { 
    "optionName": "Fries", 
    "Name": "Frites steak house", 
    "Price": 0 
}], 
"additionalPrice": 0, 
"qty": 1 }] 

答えて

2

あなたadditions変数が定義されているがforEachへの呼び出しの外で宣言しました。

forEachが反復するときは、値を加算の既存の値に連結しますが、反復ごとに空の文字列にリセットすることはありません。これがあなたのデータが蓄積する理由です。

あなたforEachコールバックの最初に空の文字列にadditionsの値を設定することにより、またはそれが反復ごとに空の配列で始まるようにそれをforEach内部を宣言することでこの問題を解決することができます。私は後者をお勧めします:

let dishes = ''; 

var msg = MessageContent.orderedDishes.forEach(function(element) { 
    // declaring your variable here ensures that 
    // it is empty at the beginning of the iteration 
    // rather than accumulating over all of them: 
    let additions = ''; 
    for(var i of element.selectedAdditions){ 
    additions += i.optionName + ' : ' + i.Name + '\n'; 
    } 
    dishes += 'Meal : ' + element.dishName + '\n' 
    + 'Options : \n' + additions + '\n' 
    + 'Category : ' + element.categoryName + '\n' 
    + 'Qty : ' + element.qty+ '\n' 
    + 'Price : ' + element.price + '\n\n'; 
}); 
+0

グッドキャッチ!なぜ私はそれを見ていないのかわかりません!ありがとうございました! +1 –

+1

あなたがこの助けを見つけてうれしいです:) – Pineda

関連する問題