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

时间:2019-02-22 20:42:47

标签: javascript object ecmascript-6

如果我知道两个JavaScript对象之间分别有一个共同的属性,分别称为“ req”和“ updatedDoc”,那么有一种方法可以使用占位符参数来表示任何键,以便可以找到与之匹配的正确键在两个物体上?我试过了,但是没用:

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

顺便说一句,在我的用例中,我知道两个对象之间总会有一个匹配的属性。为了明确起见,这两个对象称为“ req”和“ 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”中提取值。有办法吗?

3 个答案:

答案 0 :(得分:2)

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

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

if语句中的所有内容仅对req和updatedDoc中都存在的键执行。在req中为密钥存储的值将为val,该值已从Object.entries取消引用

您可以像updatedData[key] = val一样将updatedData更改为新值。如果需要,您还可以将更改存储在数组中,以供以后使用。

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)

答案 1 :(得分:1)

为什么不为第一个对象使用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);

答案 2 :(得分:0)

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

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);
      }
});