【问题标题】:Comparing Two JavaScript Objects and Pulling out Key and Value of Matching Property比较两个 JavaScript 对象并提取匹配属性的键和值
【发布时间】:2019-02-22 20:42:47
【问题描述】:

如果我知道两个 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
}

两者都有一个名为“deleted”的属性。基本上,我将传入的请求与其相关的整个文档相匹配。然后我想从“req”中获取值并将其保存到“updatedDoc”以获得正确的键。但首先我需要找到匹配的键,并从“req”中提取值。有什么办法可以做到吗?

【问题讨论】:

  • updatedDoc是objects的对象吗?
  • 您是否只测试匹配的属性和值?或者只是钥匙。如果只是键,则其中任何一个都可以:stackoverflow.com/questions/12433604/… 为您获取匹配项,然后您可以使用它来获取值等。
  • 在上面添加了更多的清晰度。
  • 是的,所以只需抓住每个键并进行比较。如果你知道一个对象只有一个键,那就更简单了;无需循环。
  • key === updatedDoc[key] 我认为这里的问题是,通过这种方式,您将 req 中的键与 updatedDoc 中的值进行比较,而您想比较这两个对象的键

标签: javascript object ecmascript-6


【解决方案1】:

你应该能够修改你的循环来改变

if (key === updatedDoc[key])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)

【讨论】:

  • 我也喜欢这个。不错。
【解决方案2】:

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

【讨论】:

  • 所以这给了我共同的键,这很好,但我还需要知道在 req.key 中找到的匹配键的值。所以,在你的情况下:[ { "b" : 4 }, { "c" : 5} ],假设objectB代表req
  • 您可以映射这些值,请参阅编辑。你想要一个具有公共键和值的对象形成 objectA 吗?
  • 这里有不错的 JavaScript 柔术。我认为这会起作用,谢谢。
【解决方案3】:

试试这个解决方案,我认为它会解决问题

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

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多