Как вы сравниваете ключи и значения в объектах JSON, когда у одного объекта есть дополнительные ключи с использованием Lodash?

#javascript #json #compare #lodash

#javascript #json #Сравнить #lodash

Вопрос:

У меня есть два объекта JSON, например:

 var obj1 = {a: "apple", b: "banana", c: "carrot"}
var obj2 = {a: "apple", e: “egg” b: "banana", c: "carrot", d: "dog"}
  

Я хочу иметь возможность выполнять логическую проверку, сравнивая два объекта, без необходимости удалять данные из любого из них. Например, если бы я использовал приведенные выше данные, логическая проверка должна возвращать true, потому что значения ключей, которые находятся в обоих объектах, совпадают.

Однако, допустим obj1 , остается прежним, но obj2 следующим:

 var obj1 = {a: "apple", b: "banana", c: "carrot"}
var obj2 = {a: "ant", e: “egg” b: "banana", c: "carrot", d: "dog"}
  

С этими данными он должен возвращать false, потому что значение ключа a не совпадает, даже если другие поля совпадают, а некоторые поля отсутствуют в обоих объектах.

Есть идеи? Я бы предпочел использовать Lodash, поскольку у них есть качественная библиотека. Изначально пытался использовать _.isEqual(obj1, obj2) , но это не подходит для моих конкретных нужд.

Ответ №1:

Я не знаю, есть ли lodash такой метод. Но вы можете достичь того же результата, просто используя Object.etnries Array.every методы and .

 var obj1 = {
  a: "apple",
  b: "banana",
  c: "carrot"
}
var obj2 = {
  a: "apple",
  b: "banana",
  c: "carrot",
  d: "dog",
  e: "egg"
}


var obj3 = {a: "apple", b: "banana", c: "carrot"}
var obj4 = {a: "ant", e: "egg" ,b: "banana", c: "carrot", d: "dog"}

function checkEquality(a, b) {
  const entries1 = Object.entries(a);
  const entries2 = Object.entries(b);

  const short = entries1.length > entries2 ? entries2 : entries1; // pick the shorter array
  const long = short === entries1 ? b : a;

  const isEqual = short.every(([k, v]) => long[k] === v);
  return isEqual;

}



console.log(checkEquality(obj1, obj2))
console.log(checkEquality(obj3, obj4))  

Комментарии:

1. Несмотря на то, что в этом не используется Lodash, это все равно качественный ответ, который поможет мне расширить мои навыки JS, большое спасибо!

Ответ №2:

_.isMatch может помочь. Проверьте приведенный ниже фрагмент

 var obj1 = {
  a: "apple",
  b: "banana",
  c: "carrot"
}
var obj2 = {
  a: "apple",
  e: "egg",
  b: "banana",
  c: "carrot",
  d: "dog"
}

console.log(_.isMatch(obj2, obj1));

var obj1 = {
  a: "apple",
  b: "banana",
  c: "carrot"
}
var obj2 = {
  a: "ant",
  e: "egg",
  b: "banana",
  c: "carrot",
  d: "dog"
}

console.log(_.isMatch(obj2, obj1));  
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>  

Обратите внимание, что _.isMatch(obj1, obj2) это не сработает. Вам нужно будет ввести некоторую логику, чтобы определить, у какого объекта больше ключей, и передать его в качестве первого аргумента.

Комментарии:

1. Спасибо за помощь! Все еще изучаю Lodash, так что это действительно помогает!