我正在尝试比较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");
如果不将对象转换为数组,我怎么能简短又简单?
答案 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。链接函数可以检查是否相等。
您可以将所有步骤链接到一个语句中,如:
_.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)
答案 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行,需要检查一行。你只需要这两张支票中的一张。