javascript - 如何比较嵌套对象/数组结构中的特定键值?
问题描述
我有两个数组如下
array1 = {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"12364",weight:"50",Oid:"456978",code:"12"}
array2 = {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith,array:[{name:"test",surname:"test",position:12}]"},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"4589632",weight:50,policy:"745896",result:"test",documents:"no",launch:"no"}
正如您所看到的,我的两个数组长度都不匹配,所以我无法比较它们。
我只想比较数组 1 和数组 2 中的某些对象。例如,只比较我需要的对象
array1
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:"50"
array 2
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:50
我只想比较上面的对象键值,所以上面会返回 true
如果我有
array1
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:"12"
array 2
name:"John"
surname:"Petter"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"t2",position:12}]},{name:"kate",surname:"Knight",array:[{name:"test",surname:"test",position:14}]}]
weight:50
以上将是错误的。
我怎样才能做到这一点?我如何过滤/循环它们以仅比较上述值。
解决方案
您可以创建一个函数来进行检查。
备注:
- 我们用于比较
==
,因为在您的示例weight: 50
中是等于weight: '50'
(字符串和数字)。 reference
该函数还使用相同的键来比较内部数组进行比较。
function compareObjects(obj1, obj2, keysToCompare) {
return keysToCompare.every(x => obj1[x] instanceof Array ?
obj1[x].every((y, yi) => compareObjects(y, obj2[x][yi], Object.keys(y))) :
obj1[x] == obj2[x]);
}
// Nothing is different - should work
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
},
{
name: 'kate',
surname: 'post'
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// One key is different - should fail
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
// This value is different
surname: 'FOOL',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// One key is different - should fail
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
// This value is different
surname: 'FOOL',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// Position is different - should work
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
},
{
name: 'kate',
surname: 'post',
position: 10,
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
}, {
name: 'kate',
surname: 'post',
position: 15,
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// Everything is same - should work (including position)
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
},
{
name: 'kate',
surname: 'post',
position: 10,
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
}, {
name: 'kate',
surname: 'post',
position: 10,
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
推荐阅读
- ruby-on-rails - 避免迁移中的重复
- ruby-on-rails - rails activerecord where 子句如何接受动态参数?
- sql - 在存储过程中将 varchar 转换为数字时出错
- javascript - 将数据传递给 v-model
- kotlin - 为什么 mutableSet 不更新!用于 Kotlin 列表中的项目
- angular - 包含换行符的字符串在 webapi 中出现没有换行符
- google-app-engine - 部署到 Google 应用引擎 (Java) 后,找不到 MemcacheServiceFactory 类错误
- c# - 如何通过 c# 从 1400 万个表中删除 100,000 个特定行?
- php - 属于子类别的某些帖子未显示在此 if 语句中
- ruby-on-rails - SQS 池的启动/停止如何在 Ruby on Rails 中工作