2016-11-18 15 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
  • 在不知道输入PARAMS operationTerms的,operationTypes & operationTypeTerms,其坚韧以产生所需要的输出。然而 基于问题逻辑&提供的输出我假设输入为 带来您正在寻找的结果。
  • 请注意,我用在这里简单的下划线,无角,但 应该不会影响到逻辑仍然

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 –