#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, так что это действительно помогает!