如何检查一个JavaScript对象中的值是否存在于另一个JavaScript对象中?

时间:2016-02-23 10:23:12

标签: javascript arrays json

我正在尝试比较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/

7 个答案:

答案 0 :(得分:13)

使用以下代码:

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的{​​{1}}的值等于密钥为k1的{​​{1}}的值。

或者更多会话英语:

  

第一个对象中的每个值都匹配第二个中的某个值。

答案 1 :(得分: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));

答案 2 :(得分:1)

对此有简短而准确的方法。

您可以使用第三方但非常受欢迎的实用程序库Lodash。链接函数可以检查是否相等。

  1. 首先将JSON解析为对象
  2. 然后使用_.values()将每个键的值提取到单独的数组中
  3. 找出两个数组的差异。如果它是一个空数组,那么它们都是相等的。
  4. 您可以将所有步骤链接到一个语句中,如:

    _.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)中包含该库,也可以下载并将其用作普通脚本。 Lodash提供了大量有用的实用功能,使JS编程变得更加容易。你最好试一试。

答案 3 :(得分:1)

如果您更喜欢使用库,则可以使用下划线isMatch

_.isMatch(object, properties)
  

告诉您属性中的键和值是否包含在中   对象

答案 4 :(得分:-1)

你可以试试这个

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');

答案 5 :(得分:-1)

如果你想知道两个对象是否都有相同的键,那么如果没有至少将两个对象的键转换为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中是否存在json1中的所有键,您可以这样做:

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');
}

答案 6 :(得分:-1)

在您的问题和评论中,您表明您只想验证“json_str2中的所有元素都存在于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行,需要检查一行。你只需要这两张支票中的一张。