如果我知道两个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”中提取值。有办法吗?
答案 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);
}
});