Сравнение двух объектов JavaScript и извлечение ключа и значения совпадающего свойства - PullRequest
0 голосов
/ 22 февраля 2019

Если я знаю, что между двумя 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 голосов
/ 23 февраля 2019

Попробуйте это решение, я думаю, что оно решит проблему

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);
      }
});
0 голосов
/ 23 февраля 2019

Вы должны иметь возможность просто изменить свой цикл, чтобы изменить

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

Все, что внутри этого оператора, будет выполняться только для ключей, которые существуют как в req, так и в 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)
0 голосов
/ 23 февраля 2019

Почему бы не взять 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...