比较两个JavaScript对象,并提取匹配属性的键和值



如果我知道分别在两个称为" req"one_answers" UpdatedDoc"的JavaScript对象之间有共同的属性,我是否可以使用占位符参数来表示任何键,以便我可以找到在两个对象上匹配的合适的一个?我尝试过,但它不起作用:

for (const [key, val] of Object.entries(req)) {
  if (key === updatedDoc[key]) {
    console.log("key, val", key, val);
  }
}

顺便说一句,在我的用例中,我知道两个对象之间总是有一个匹配的属性。为了澄清,这两个对象称为" req"one_answers" updatedDoc"。我不知道它们的关键是什么,但是我知道这两个对象将有一个共同点。

要添加更多清晰度," req"将很简单,例如:

const req = { 
  "deleted" : true, 
  "apiKey" : "4d9d9291", 
  "token" : "ffdsfjsdfsdjfa" 
}

...而updatedDoc将是一个完整的文档,因此:

const updatedDoc = {
   _id: <ObjectId>,
   firstName: "John",
   lastName: "Smith",
   age: 42
   deleted: false
}

都有一个称为"删除"的属性。基本上,我将通过的请求与与之相关的整个文档匹配。然后,我想从" req"中获取值,并将其保存到" UpdatedDoc"中以获取正确的密钥。但是首先,我需要找到匹配的键,然后从" req"中拔出值。有什么办法可以做到吗?

您应该能够修改循环以更改

if (key === updatedDoc[key]) to if (key in updatedDoc)

此IF语句中的所有内容都只能在REQ和UpdatedDoc中存在的密钥上执行。req中的密钥存储的值将为val,从Object.entries

中删除

您可以将UpdatedData更改为新值,例如updatedData[key] = val。您还可以将更改存储在阵列中以供以后使用。

const updatedDoc = {
  firstName: "John",
  lastName: "Smith",
  age: 42,
  deleted: false
}
const req = {
  "deleted": true,
  "apiKey": "4d9d9291",
  "token": "ffdsfjsdfsdjfa"
}
const changes = []
for (const [key, val] of Object.entries(req)) {
  if (key in updatedDoc) {
    // get the previous value
    const oldVal = updatedDoc[key]
    // update updatedDoc
    updatedDoc[key] = val
    // store the change or do whatever
    changes.push({
      [key]: {
        new: val,
        old: oldVal
      }
    })
  }
}
console.log(updatedDoc)
console.log(changes)

为什么不为第一个对象服用Set并过滤第二个对象的键。

结果是带有通用键的数组。

var objectA = { a: 1, b: 2, c: 3 },
    objectB = { b: 4, c: 5, d: 6 },
    common = Object.keys(objectB).filter(Set.prototype.has, new Set(Object.keys(objectA))),
    values = common.map(k => objectA[k]);
console.log(common);
console.log(values);

有点短的版本。

var objectA = { a: 1, b: 2, c: 3 },
    objectB = { b: 4, c: 5, d: 6 },
    common = Object.keys(objectA).filter({}.hasOwnProperty.bind(objectB)),
    values = common.map(k => objectA[k]);
console.log(common);
console.log(values);

尝试此解决方案,我认为它将解决问题

updatedDoc.forEach(function(i,v){
for (const [key, val] of Object.entries(req)) {
      if (key === i && req[key]==updatedDoc[i]) {
            console.log("key, val", key, val);
      }
});

最新更新