Javascript 比较两个对象数组并合并缺少的对象
我有两个对象数组。第一个是一组经理。第二个是从第一个数组中选择的管理器数组。区别在于我添加了一个选定的属性:true。现在,我需要用选定的管理器替换第一个数组中的管理器。我正在使用我创建的AngularJS服务进行此操作。我相信有更简单的解决方案,所以我愿意接受建议。JavaScript、jQuery、lodash、LINQ.js都很好。 我有一个plunker,我已经展示了我需要的结果。请注意,管理器没有selected:true属性。Javascript 比较两个对象数组并合并缺少的对象,javascript,jquery,angularjs,lodash,linq.js,Javascript,Jquery,Angularjs,Lodash,Linq.js,我有两个对象数组。第一个是一组经理。第二个是从第一个数组中选择的管理器数组。区别在于我添加了一个选定的属性:true。现在,我需要用选定的管理器替换第一个数组中的管理器。我正在使用我创建的AngularJS服务进行此操作。我相信有更简单的解决方案,所以我愿意接受建议。JavaScript、jQuery、lodash、LINQ.js都很好。 我有一个plunker,我已经展示了我需要的结果。请注意,管理器没有selected:true属性。 正如你所说,我确实认为可能有一种更简单的方法来做到这一
正如你所说,我确实认为可能有一种更简单的方法来做到这一点 我建议您选择一个JavaScript库,它使用非常有用的方法扩展本机对象。 在你的情况下,医生在
对我来说,它对处理大量本机JavaScript对象JSON有很大帮助。正如你所说,我确实认为有一种更简单的方法可以做到这一点 我建议您选择一个JavaScript库,它使用非常有用的方法扩展本机对象。 在你的情况下,医生在
对我来说,处理大量本地JavaScript对象JSON非常有帮助。这行吗?循环浏览新的管理器数组,使用旧管理器数组中匹配的管理器对象的lodash查找索引,并在旧管理器数组中用新管理器数组中的管理器替换索引(如果找到) 也许有一种更有效的方法来解决这个问题,但假设我正确地理解了你的问题,我相信这应该行得通?无法测试,因为我目前正在工作
for(var i=0; i < SelectedManagersArray.length; i++){
var index = _.findIndex(OldManagersArray, {id: SelectedManagersArray[i].id, fullName: selectedManagersArray[i].fullName);
//I believe lodash returns a -1 if a matching index isn't found.
if(index !== -1){SelectedManagersArray[index] = OldManagersArray[i]}
}
这样行吗?循环浏览新的管理器数组,使用旧管理器数组中匹配的管理器对象的lodash查找索引,并在旧管理器数组中用新管理器数组中的管理器替换索引(如果找到) 也许有一种更有效的方法来解决这个问题,但假设我正确地理解了你的问题,我相信这应该行得通?无法测试,因为我目前正在工作
for(var i=0; i < SelectedManagersArray.length; i++){
var index = _.findIndex(OldManagersArray, {id: SelectedManagersArray[i].id, fullName: selectedManagersArray[i].fullName);
//I believe lodash returns a -1 if a matching index isn't found.
if(index !== -1){SelectedManagersArray[index] = OldManagersArray[i]}
}
你可以用
var eventUsers=[{
事件用户ID:1009,
事件编号:11,
用户ID:15e640c1-a481-4997-96a7-be2d7b3fcabb
}, {
事件用户ID:1010,
事件编号:11,
用户ID:250a19be-e661-4c04-9a50-c84b0e7349b7
}, {
事件用户ID:1011,
事件编号:11,
用户ID:4cada7f0-b961-422d-8cfe-4e96c1fc11dd
}, {
事件用户ID:1013,
事件编号:11,
用户ID:a3125317-5deb-426d-bbb1-06d3bd4ebaa6
}];
风险值管理人=[{
id:15e640c1-a481-4997-96a7-be2d7b3fcabb,
全名:Kul Srivastva
}, {
id:250a19be-e661-4c04-9a50-c84b0e7349b7,
全名:托德兄弟
}, {
id:4cada7f0-b961-422d-8cfe-4e96c1fc11dd,
全名:鲁迪·桑切斯
}, {
id:79823c6d-de52-4464-aa7e-a15949fb25fb,
全名:Mike Piehota,
}, {
识别号:a3125317-5deb-426d-bbb1-06d3bd4ebaa6,
全名:尼克·布罗德赫斯特
}];
var eventUserIds=eventUsers.mape=>e.user\u ID;
managers=managers.mape=>{
如果eventUserIds.indexOfe.id!=-1{
e、 所选=真;
}
返回e;
}
控制台。日志管理器;
document.getElementById'result'.innerHTML=JSON.StringifyManager,0,4;
你可以用
var eventUsers=[{
事件用户ID:1009,
事件编号:11,
用户ID:15e640c1-a481-4997-96a7-be2d7b3fcabb
}, {
事件用户ID:1010,
事件编号:11,
用户ID:250a19be-e661-4c04-9a50-c84b0e7349b7
}, {
事件用户ID:1011,
事件编号:11,
用户ID:4cada7f0-b961-422d-8cfe-4e96c1fc11dd
}, {
事件用户ID:1013,
事件编号:11,
用户ID:a3125317-5deb-426d-bbb1-06d3bd4ebaa6
}];
风险值管理人=[{
id:15e640c1-a481-4997-96a7-be2d7b3fcabb,
全名:Kul Srivastva
}, {
id:250a19be-e661-4c04-9a50-c84b0e7349b7,
全名:托德兄弟
}, {
id:4cada7f0-b961-422d-8cfe-4e96c1fc11dd,
全名:鲁迪·桑切斯
}, {
id:79823c6d-de52-4464-aa7e-a15949fb25fb,
全名:Mike Piehota,
}, {
识别号:a3125317-5deb-426d-bbb1-06d3bd4ebaa6,
全名:尼克·布罗德赫斯特
}];
var eventUserIds=eventUsers.mape=>e.user\u ID;
managers=managers.mape=>{
如果eventUserIds.indexOfe.id!=-1{
e、 所选=真;
}
返回e;
}
控制台。日志管理器;
document.getElementById'result'.innerHTML=JSON.StringifyManager,0,4;
简单实现:
for(var i = 0; i < eventUsers.length; i++) {
for(var j = 0; j < managers.length; j++) {
if(eventUsers[i].user_ID === managers[j].id) {
managers[j].selected = true;
}
}
}
简单实现:
for(var i = 0; i < eventUsers.length; i++) {
for(var j = 0; j < managers.length; j++) {
if(eventUsers[i].user_ID === managers[j].id) {
managers[j].selected = true;
}
}
}
非常混乱的问题描述。您试图解决的更高级别的用例和问题是什么?您尝试了什么?没有选择的经理如何:正确?????你说,注意经理没有“selected:true”属性,但没有解释这是怎么回事。是的,对不起,我很难找到帮助,因为我解释得不好。请给我一分钟,我将解释总体情况。我想我看到了您试图实现的目标……您是否可以在选定经理的新数组中循环,并使用lodash的findByIndex方法在m的第一个数组中搜索选定经理数组中的每个经理
管理器,如果找到索引,是否将第一个数组中的管理器替换为第二个数组中循环当前所针对的管理器?据我所知,您想要实现的目标是:在eventUsers之间循环,如果eventUsers[I].user_ID等于managers[j].ID,则向managers[j]添加所选属性:true。对吗?非常混乱的问题描述。您试图解决的更高级别的用例和问题是什么?您尝试了什么?没有选择的经理如何:正确?????你说,注意经理没有“selected:true”属性,但没有解释这是怎么回事。是的,对不起,我很难找到帮助,因为我解释得不好。请给我一分钟,我将解释总体情况。我想我明白了您试图实现的目标……您是否可以在选定经理的新数组中循环,并使用lodash的findByIndex方法在第一个经理数组中搜索选定经理数组中的每个经理,如果找到索引,是否将第一个阵列中的管理器替换为第二个阵列中循环当前所针对的管理器?据我所知,您想要实现的目标是:在eventUsers之间循环,如果eventUsers[I].user_ID等于managers[j].ID,则向managers[j]添加所选属性:true。对吗?如果使用Freeeez建议的方法,只需像我在代码中写的那样查找索引,基本上说ifindex!==1{selectedManagerArray[index]。selected=true}。可能是一种更好的方法,因为使用来自不同位置的其他对象替换对象可能会因为按引用而不是值传递而变得混乱。如果使用lodash,则在任何地方都使用它,例如forEach而不是for。另一方面,仅仅为几个代码字符串使用如此庞大的库是毫无意义的。实际上,使用像Freeeez建议的方法并像我在代码中写的那样查找索引,然后基本上说ifindex!==1{selectedManagerArray[index]。selected=true}。可能是一种更好的方法,因为使用来自不同位置的其他对象替换对象可能会因为按引用而不是值传递而变得混乱。如果使用lodash,则在任何地方都使用它,例如forEach而不是for。另一方面,仅为几串代码使用如此庞大的库是毫无意义的。@Tushar StackOverflow上的新功能,thx编辑答案的帮助,谢谢!注意下次降噪;布局@Tushar关于StackOverflow的最新信息,thx帮助编辑答案,谢谢!注意下次降噪;布局