Как проверить, имеются ли значения в одном объекте JavaScript в другом?
Я пытаюсь сравнить json_str1 и json_str2, здесь он должен возвращать true, поскольку все элементы в json_str1 присутствуют в json_str2.
На данный момент я делаю это так долго, как это
json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';
json_obj1 = $.parseJSON(json_str1);
json_obj2 = $.parseJSON(json_str2);
arr1 = $.map(json_obj1, function(el) { return el });
arr2 = $.map(json_obj2, function(el) { return el });
if($(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0)
alert("equal");
else
alert("not equal");
Как я могу сделать это коротким и простым, не преобразовывая объекты в массив?
https://jsfiddle.net/kq9gtdr0/
Ответы
Ответ 1
Используйте следующий код:
Object.keys(json_obj1) . every(k1 =>
Object.keys(json_obj2) . some(k2 =>
json_obj1[k1] === json_obj2[k2]
)
);
На английском языке:
Каждый ключ k1
в json_obj1
удовлетворяет условию, что некоторый ключ k2
в json_obj2
удовлетворяет условию, что значение json_obj1
с ключ k1
равен значению json_obj2
с ключом k2
.
Или на более разговорном английском языке:
Каждое значение в первом объекте соответствует некоторому значению во втором.
Ответ 2
Использование lodash
var _ = require('lodash');
function compareValues(jstr1, jstr2) {
return _.isEqual(_.valuesIn(JSON.parse(jstr1)).sort(), _.valuesIn(JSON.parse(jstr2)).sort());
}
json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';
console.log(compareValues(json_str1, json_str2));
Ответ 3
Существует короткий и легкий точный способ этого.
Вы можете использовать стороннюю, но чрезвычайно популярную библиотеку утилиты Lodash. Целевые функции, которые вы можете проверить на равенство.
- Сначала проанализируйте оба JSON в объектах
- Затем используйте _.values () для извлечения значений всех ключей каждого из них в отдельные массивы
- Найдите разницу в двух массивах. Если его пустой массив, то оба они равны.
Вы можете объединить все шаги в один оператор, например:
_.isEmpty(_.difference(_.values(json_obj1), _.values(json_obj2)))
Пример: https://jsfiddle.net/kq9gtdr0/4/
Для получения дополнительной информации:
https://lodash.com/docs#values
https://lodash.com/docs#difference
https://lodash.com/docs#isEmpty
Вы можете включить библиотеку из CDN (https://cdn.jsdelivr.net/lodash/4.5.1/lodash.min.js) или загрузить и использовать ее как обычно script. Lodash предлагает множество полезных функций утилиты, что значительно упрощает программирование JS. Тебе лучше попробовать.
Ответ 4
Если вы предпочитаете использовать библиотеки, то вы можете использовать underscore isMatch
_.isMatch(object, properties)
Сообщает вам, содержатся ли ключи и значения в свойствах в объект.
Ответ 5
Вы можете попробовать это
var json_str1 = {"0":"a","1":"b","2":"c"};
var json_str2 = {"0":"c","1":"b","2":"a"};
var flag = 1;
if(Object.keys(json_str1).length == Object.keys(json_str2).length){
Object.keys(json_str1).forEach(function(x){
if(!json_str2.hasOwnProperty(x) || json_str2[x] != json_str1[x]){
flag = 0;
return;
}
});
}
if(flag)
alert('equal');
else
alert('Not Equal');
Ответ 6
Если вы хотите узнать, имеют ли оба объекта одни и те же ключи, нет никакого способа сделать это, не переведя ключи обоих объектов в массив с помощью Object.keys
или прокручивая оба объекта!
Причина проста: ясно, что вам нужно сравнить количество ключей обоих объектов, и единственный способ сделать это - перебрать все свойства или Object.keys
.
Итак, я думаю, что самый короткий способ сделать это:
json_obj1 = JSON.parse('{"0":"a","1":"b","2":"c"}');
json_obj2 = JSON.parse('{"0":"c","1":"b","2":"a"}');
keys_1 = Object.keys(json_obj1);
keys_2 = Object.keys(json_obj2);
if(keys_1.length === keys_2.length && keys_1.every(key => keys_2.indexOf(key) >= 0)) {
alert('equal')
} else {
alert('not equal')
}
Если вы хотите проверить, есть ли все ключи из json1 в json2, вы можете сделать:
json_obj1 = JSON.parse('{"0":"a","1":"b","2":"c"}');
json_obj2 = JSON.parse('{"0":"c","1":"b","2":"a"}');
if(Object.keys(json_obj1).every(key => key in json_obj2)) {
alert('equal');
} else {
alert('not equal');
}
Ответ 7
В вашем вопросе и комментариях вы указываете, что вы только хотите проверить, что "все элементы в json_str1 присутствуют в json_str2". Ваш примерный код не просто делает это, он проверяет полное равенство ключей путем тестирования, если все ключи (не значения) в первом объекте находятся во втором объекте, и все ключи второго объекта находятся в первом объекте, Посмотрев на свой код, я предполагаю, что когда вы говорите "элементы", вы имеете в виду ключи.
Все, что в стороне, это может помочь:
// Your first few lines of code
json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';
json_obj1 = $.parseJSON(json_str1);
json_obj2 = $.parseJSON(json_str2);
// My new code
var values1 = Object.keys(json_obj1).map(key => json_obj1[key]);
var values2 = Object.keys(json_obj2).map(key => json_obj2[key]);
// Check if every key in the first object is in the second object.
values1.every(k1 => values2.indexOf(k1) >= 0);
// OR
// Check for equality of keys by checking both directions.
values1.every(k1 => values2.indexOf(k1) >= 0) && values2.every(k2 => values1.indexOf(k2) >= 0);
Это 2 строки, чтобы получить ключи, и одну строку для проверки. Вам нужна только одна из этих двух проверок.