首页 > 解决方案 > 如何比较嵌套对象/数组结构中的特定键值?

问题描述

我有两个数组如下

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

以上将是错误的。

我怎样才能做到这一点?我如何过滤/循环它们以仅比较上述值。

标签: javascriptarraysobjectdata-structurescomparison

解决方案


您可以创建一个函数来进行检查。


备注:

  • 我们用于比较==,因为在您的示例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',
]));


推荐阅读