找出n个对象数组之间的差异(使用额外的对象)
Find differences (with additional objects) between n arrays of objects
我有一个名为props
的数组,它包含n
个有对象的数组,所有数组可以包含不同数量的对象。
每个对象有4个属性:participation_enabled
, name
, pathing_enabled
, id
,这些属性可以在相同的属性id的其他数组中具有不同的值…
我有两个目标:
1)找到所有在其他对象数组中不同的对象属性,并将其存储在另一个名为diffs的数组中;
2)找到所有在其他数组(唯一的id
)中找不到的额外对象,并将它们存储在另一个名为extra.
我的代码成功返回了差异,但它没有返回所有额外的对象…
的例子:
[
[
{participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"},
{participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"},
{participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"},
{participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"},
{participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
{participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
{participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"}
],
[
{participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"},
{participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"},
{participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"}
],
[
{participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"},
{participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"},
{participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"},
{participation_enabled:"false", name:"User ID", pathing_enabled:"true", id:"prop4"},
{participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
]
]
在这个例子中,diffs
数组应该包含:
[
{id:"prop1", participation_enabled:["false","true"], pathing_enabled:["false","true"], index:0},
{id:"prop2", participation_enabled:["false","true"], name:["User Status","Room"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:1},
{id:"prop3", participation_enabled:["false","true"], name:["Initial ID","Trackingcode"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:2},
{id:"prop4", pathing_enabled:["false","true"], index:3}
]
extra
数组应该是:
[
{participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
{participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
{participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"},
{participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"},
{participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
]
这是我的代码:
var diff = {};
var extra = [];
props.forEach(function(val, i){
if (i == 0) {
val.forEach(function(v1, ind){
diff[v1.id] = {};
diff[v1.id].index = [ind];
for (var key in v1) {
diff[v1.id][key] = [v1[key]];
}
});
}
else {
val.forEach(function(v1){
var id = v1.id;
for (var key in v1) {
if(diff[id]) {
diff[id][key].push(v1[key]);
}
}
if(!diff[id]) {
extra.push(v1);
}
});
}
});
for (var key in diff) {
var nested = diff[key];
var index = nested.index.pop();
for (nestedKey in nested) {
nested[nestedKey] = underscoreGS._filter(nested[nestedKey], function(item, pos) {
return nested[nestedKey].indexOf(item) == pos;
});
if (nested[nestedKey].length < 2) {delete nested[nestedKey];}
}
diff[key].id = key;
diff[key].index = index
if (underscoreGS._keys(diff[key]).length < 3) {delete diff[key];}
}
diff = underscoreGS._values(diff);
return [diff, extra];
这是我实现和工作的解决方案:
var variable = [
[
{participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"},
{participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"},
{participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"},
{participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"},
{participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
{participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
{participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"}
],
[
{participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"},
{participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"},
{participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"}
],
[
{participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"},
{participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"},
{participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"},
{participation_enabled:"false", name:"User ID", pathing_enabled:"true", id:"prop4"},
{participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
]
];
var diff = {};
var extra = [];
var ids = [];
var unique = [];
variable.forEach(function(val){
val.forEach(function(v1) {
ids.push(v1.id);
});
})
ids.filter(function(a){
if(ids.indexOf(a) == ids.lastIndexOf(a)) {
unique.push(a);
}
});
variable.forEach(function(val){
val.forEach(function(v1){
if(unique.indexOf(v1.id) >= 0) {
extra.push(v1);
}
});
});
variable.forEach(function(val, i){
if (i == 0) {
val.forEach(function(v1, ind){
diff[v1.id] = {};
diff[v1.id].index = [ind];
for (var key in v1) {
diff[v1.id][key] = [v1[key]];
}
});
}
else {
val.forEach(function(v1){
var id = v1.id;
for (var key in v1) {
if(diff[id]) {
diff[id][key].push(v1[key]);
}
}
});
}
});
for (var key in diff) {
var nested = diff[key];
var index = nested.index.pop();
for (nestedKey in nested) {
nested[nestedKey] = _.filter(nested[nestedKey], function(item, pos) {
return nested[nestedKey].indexOf(item) == pos;
});
if (nested[nestedKey].length < 2) {delete nested[nestedKey];}
}
diff[key].id = key;
diff[key].index = index
if (_.keys(diff[key]).length < 3) {delete diff[key];}
}
diff = _.values(diff);
console.log("extra:", extra);
console.log("diff:", diff);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在Javascript中转换对象数组
- 在JavaScript中通过索引从对象数组中获取值
- Backbone虹吸以获取对象数组
- 如何在DataTables 2.1中迭代对象数组
- Javascript-根据赋值顺序,按键合并对象数组
- 将事件附加到对象/数组
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript在数组中获取对象数组中键的所有不同值
- 在对象数组中查找多个值的d3范围
- Undercore.js获取对象数组中键对象的值
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 如何通过json对象数组为嵌套对象赋值
- 如何循环通过2个对象数组并通过匹配id进行合并
- 为对象数组创建列表项
- 如何使用javascript合并两个对象数组
- JSON到对象数组,并向每个对象添加项
- JavaScript:从对象数组中获取唯一值及其计数
- 按不同项目对对象数组进行排序