2016-11-18 4 views
2

入れ子になっています2 _.forEach;_.forEachループ値すべての継承されたデータを変更する

_.forEach(this.operationTypes, (value: any, key) => { 
    value.Terms = []; 
    this.operationLimits.push(value); 
    _.forEach(this.operationTerms, (subValue: OperationTerm, subKey) => { 
    let typeTerms = _.filter(this.operationTypeTerms, { OperationType: { Id: value.Id }, OperationTerm: { Id: subValue.Id } }); 
    subValue.TypeTerms = typeTerms[0]; 
    this.operationLimits[key].Terms.push(subValue); 
    }); 
}); 

ただし、最後のループの値と同じ値をすべてTypeTerms作成します。 これは、新しい値が私のforeachループsubValueから継承されたことを意味します。subValueが変更された場合、これから自動的に変更されるすべての値が自動的に変更されます。

これを防止する方法は?

おかげ

編集:

それはこのようになるはず。

[ 
{ 
Active: true, 
Id: 2, 
Name: "Cash Out", 
Terms: [ 
    { 
    Id: 2, 
    Name: "Daily Limit", 
    TypeTerms: "Forbidden" -> all of these are same 'forbidden', but it could be 'forbidden' or 'allowed'. At the end of the loop all data changed to forbidden, because the last datas TypeTerms value is 'forbidden' 
    }, 
    { 
    Id: 3, 
    Name: "Weekly Limit", 
    TypeTerms: "Forbidden" 
    } 
] 
}, 
{ 
Active: true, 
Id: 3, 
Name: "Top Up", 
Terms: [ 
    { 
    Id: 2, 
    Name: "Daily Limit", 
    TypeTerms: "Forbidden" 
    }, 
    { 
    Id: 3, 
    Name: "Weekly Limit" 
    TypeTerms: "Forbidden" 
    } 
] 
} 
] 
+3

二つのネストされたループに影響を与えるべきではない、単純なここにアンダースコアなしの角度が、 を使用していたことに注意してくださいとフィルタは、候補のように思えますリファクタリング入力データと目的の出力の小さなサンプルを提供できますか? – jmargolisvt

+0

ベースエントリ –

答えて

1
  • operationTerms、operationTypes & operationTypeTerms、必要な出力を生成するために、そのタフのPARAMS入力を知らず。しかし、 質問ロジックに基づいて&出力を提供した私は への入力を想定しています。
  • は、私はそれにもかかわらず、論理

operationTypes = [{ 
 
    "Active": true, 
 
    "Id": 2, 
 
    "Name": "Cash Out" 
 
}, { 
 
    "Active": true, 
 
    "Id": 3, 
 
    "Name": "Top Up" 
 
}] 
 

 
operationTerms = [{ 
 
    Id: 2, 
 
    Name: "Daily Limit" 
 
}, { 
 
    Id: 3, 
 
    Name: "Weekly Limit" 
 
}] 
 

 
operationTypeTerms = [{ 
 
    "operationTypeId": 2, 
 
    "operationTermId": 2, 
 
    TypeTerms: ["Forbidden"] 
 
}, { 
 
    "operationTypeId": 3, 
 
    "operationTermId": 3, 
 
    TypeTerms: ["Allowed", "Forbidden"] 
 
}, { 
 
    "operationTypeId": 3, 
 
    "operationTermId": 2, 
 
    TypeTerms: ["Forbidden"] 
 
}, { 
 
    "operationTypeId": 2, 
 
    "operationTermId": 3, 
 
    TypeTerms: ["Allowed", "Forbidden"] 
 
}] 
 

 

 
var result = []; 
 
_.each(operationTypes, function(type) { 
 
    var typeObj = _.extend(type, {}); 
 
    var terms = []; 
 
    _.each(operationTerms, function(term) { 
 
    var val = _.extend(term, {}); 
 
    var typeTermObj = _.filter(operationTypeTerms, { 
 
     operationTypeId: type.Id, 
 
     operationTermId: term.Id 
 
    }); 
 
    val.TypeTerms = typeTermObj[0].TypeTerms[0]; 
 
    terms.push(val); 
 
    }); 
 
    typeObj.Terms = terms; 
 
    result.push(typeObj) 
 
}); 
 

 
$("#result").html(JSON.stringify(result))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<div id="result"></div>

+0

で更新します。できます! operationTypeIdのような新しいインスタンスを作成する重要なポイント:type.Id、operationTermId:term.Id –

関連する問題