【发布时间】:2015-05-18 19:39:23
【问题描述】:
我有一个带有新数据的对象和一个带有已保存数据的数组。如果来自 newData 的 cnName 已经存在于 cnData 数组中的 savedData 中,那么 savedData 中的那个对象应该被替换为 newData.cnData[0] 对象。如果它不存在,那么数据应该被推送到savedData中的cnData数组中
newData = {
"cnGroupName": "cnGroupName1",
"cnData": [{
"cnName": "cn3",
"data": {
"color": "blue",
"size": "42",
"position": "right"
}
}]
}
savedData = [{
"cnGroupName": "cnGroupName1",
"cnData": [{
"cnName": "cn1",
"data": {
"color": "red",
"size": "42",
"position": "right"
}
}, {
"cnName": "cn2",
"data": {
"color": "blue",
"size": "11",
"position": "top"
}
}]
}]
我正在使用下划线
if(savedData.length){
_.each(savedData, function(num, i){
if(savedData[i].cnGroupName == newData.cnGroupName ){
_.each(savedData[i].cnData, function(num, x){
if(savedData[i].cnData[x].cnName == newData.cnData[0].cnName){
// the cnName already exists in savedData so replace
savedData[i].cnData[x] = newData.cnData[0]
}else{
// the cnName does NOT exist in savedData so push the new object to savedData
savedData[i].cnData.push(newData.cnData[0])
}
})
}else{
// the cnGroupName from newData is not in saveData so push newData
savedData.push(newData)
}
})
}
这不起作用的原因是因为在第二个 _.each() 语句中。如果 cnName 在 savedData 中不存在,它将为已在 savedData 中的每个对象推送一次 newData。因此,如果 savedData 中已经有 2 个保存的对象,那么 newData 将被推送 2 次p>
你可以在这个 plunker 中看到控制台日志表明 newData 被推送了两次
http://plnkr.co/edit/GkBoe0F65BCEYiFuig57?p=preview
我的两个问题是
- 有没有更简洁的下划线方式?
- 有没有办法阻止 _.each() 继续循环?
【问题讨论】:
-
您似乎只想执行对象的递归合并? Lodash 有一个
[_.merge](https://lodash.com/docs#merge)函数可以完成你想要的(他们还有很多其他库也可以做到这一点。 -
你不能停止
_.each,但你可以改用_.any。返回 true 停止
标签: javascript arrays underscore.js