Как проверить, имеются ли значения в одном объекте 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 строки, чтобы получить ключи, и одну строку для проверки. Вам нужна только одна из этих двух проверок.