Javascript 如何在两组对象中找到差异?
鉴于这两个目标Javascript 如何在两组对象中找到差异?,javascript,loops,object,for-loop,Javascript,Loops,Object,For Loop,鉴于这两个目标 var obj1 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}]; var obj2 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}, {number: 23, team: 'Cavaliers', lastname: 'James'}]; 在这种情况下,我如何迭代这两种方法以返回差异 {number: 23, team: 'Cavaliers', lastname
var obj1 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}];
var obj2 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}, {number: 23, team: 'Cavaliers', lastname: 'James'}];
在这种情况下,我如何迭代这两种方法以返回差异
{number: 23, team: 'Cavaliers', lastname: 'James'}
我已经安排了一些事情
var difference = {};
if (obj2.length > obj1.length) {
for (var i = 0; i < obj2.length; i++) {
for (var j in obj2[i]) {
for (var k in obj1[i]) {
if (!(obj2[i][j] === obj1[i][k])) {
difference.push(obj2[i][j]);
}
}
}
}
}
var差={};
如果(obj2.length>obj1.length){
对于(变量i=0;i
我明白为什么这是错误的,我只是想不出如何同时循环第一个和第二个对象的键来比较它们以修复它。如果
obj2
与obj1
相同,但推送了其他项,那么更改集就是:
obj2.slice(obj1.length);
如果
obj2
与obj1
相同,但推送了其他项目,则更改集仅为:
obj2.slice(obj1.length);
你的循环效率很低。我不确定您从哪里获取数据,但如果您自己定义结构,我建议更改结构,使每个“对象”实际上是一个对象,而不是一个数组,并且每个“玩家”对象都有一个特定于该玩家的唯一ID 例如,您可以像这样重新定义结构:
obj1 = {};
obj1.mJordan = new ConstructorForPlayer(23, "Bulls", "Jordan");
因此,当您迭代时,您可以使用for…in:
for (var player in obj1){
if (typeof obj2[player] !== 'undefined'){
//some equality function here,
//possibly defined in the prototype for the player object
} else {
changes.push(obj1[player]);
}
}
我也不确定您是如何尝试跟踪更改的,或者是否将整个新对象放入
更改数组是您希望它的格式,但我认为您的主要问题是数据结构。您的循环效率非常低。我不确定您从哪里获取数据,但如果您自己定义结构,我建议更改结构,使每个“对象”实际上是一个对象,而不是一个数组,并且每个“玩家”对象都有一个特定于该玩家的唯一ID
例如,您可以像这样重新定义结构:
obj1 = {};
obj1.mJordan = new ConstructorForPlayer(23, "Bulls", "Jordan");
因此,当您迭代时,您可以使用for…in:
for (var player in obj1){
if (typeof obj2[player] !== 'undefined'){
//some equality function here,
//possibly defined in the prototype for the player object
} else {
changes.push(obj1[player]);
}
}
我也不确定您是如何尝试跟踪更改的,或者将整个新对象放入changes
数组是否是您希望它的格式,但我认为您的主要问题是数据结构。花式LINQ回答:
Array.prototype.any = function(obj){
for(var item in this){
var test = false;
for(var name in this[item]){
test = obj[name] === this[item][name];
}
if(test)
return test;
}
return false;
};
//usage
obj2.any(obj1[0]);
别致的林克风格回答:
Array.prototype.any = function(obj){
for(var item in this){
var test = false;
for(var name in this[item]){
test = obj[name] === this[item][name];
}
if(test)
return test;
}
return false;
};
//usage
obj2.any(obj1[0]);
你所说的“变化”是什么意思?差异可能是一个更好的词语选择。在第二个例子中,有一个新的对象,我希望它被存储起来。对于这个特定的例子,你可以比较两个数组的长度。变化为obj2.slice(obj1.length)代码>。你大概是说别的吧。太棒了,很简单。谢谢。你对“改变”或“差异”的定义在这里并不完全清楚。假设difference
是一个数组,您希望将obj2
中存在但不在obj1
中的任何对象推送到该数组上(反过来呢?)或者obj2
中与obj1
中不同的任何对象,这会引发一个问题,即如何区分添加的对象和更改的对象?是否将其中一个属性视为主键?您所说的“更改”是什么意思?差异可能是一个更好的单词选择。在第二个例子中,有一个新的对象,我希望它被存储起来。对于这个特定的例子,你可以比较两个数组的长度。变化为obj2.slice(obj1.length)代码>。你大概是说别的吧。太棒了,很简单。谢谢。你对“改变”或“差异”的定义在这里并不完全清楚。假设difference
是一个数组,您希望将obj2
中存在但不在obj1
中的任何对象推送到该数组上(反过来呢?)或者obj2
中与obj1
中不同的任何对象,这会引发一个问题,即如何区分添加的对象和更改的对象?其中一个属性是否被视为主键?如果阵列拼接…一个项目被删除并替换为另一个项目,此功能是否有效?否,此功能仅适用于我提到的狭窄约束。如果阵列拼接…一个项目被删除并替换为另一个项目,此功能是否有效?否,这只适用于我提到的狭义约束。是的,数据不在我的掌握之中,并且是在一个对象文本数组中。在我的例子中,能够有效地使用for-in循环将节省大量时间。谢谢你的意见。当/如果我可以更改数据时,这看起来是一个不错的选择。是的,数据不在我的手中,并且位于对象文本数组中。在我的例子中,能够有效地使用for-in循环将节省大量时间。谢谢你的意见。如果我可以更改数据,这看起来是个不错的选择