[英]How to check if values in one JavaScript object are present in another one?
我正在嘗試比較 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");
在不將對象轉換為數組的情況下,如何使其簡短而簡單?
使用以下代碼:
Object.keys(json_obj1) . every(k1 =>
Object.keys(json_obj2) . some(k2 =>
json_obj1[k1] === json_obj2[k2]
)
);
用英語講:
每個鍵
k1
在json_obj1
滿足一些關鍵條件k2
在json_obj2
satisifies條件是價值json_obj1
與關鍵k1
等於價值json_obj2
與關鍵k2
。
或者更多會話英語:
第一個對象中的每個值都匹配第二個中的某個值。
使用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));
有簡短而准確的方法。
您可以使用第三方但非常受歡迎的實用程序庫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編程變得更加容易。 你最好試一試。
擴展@user663031 的精彩答案,以防您需要進行深入比較,這里的代碼有效:
export function objectOneInsideObjectTwo(jsonObj1: any, jsonObj2: any): boolean {
return Object.keys(jsonObj1).every((k1) => {
if (parseType(jsonObj1[k1]) === 'dict') {
return objectOneInsideObjectTwo(jsonObj1[k1], jsonObj2[k1]);
}
if (parseType(jsonObj1[k1]) === 'array') {
const results: boolean[] = [];
jsonObj1[k1].forEach((o: any, i: number) => {
if (parseType(o) === 'dict') {
results.push(objectOneInsideObjectTwo(o, jsonObj2[k1][i]));
} else {
results.push(o === jsonObj2[k1][i]);
}
});
return results.every((r) => r);
}
return Object.keys(jsonObj2).some((k2) => jsonObj1[k1] === jsonObj2[k2]);
});
}
export function parseType<T>(v: T): string {
if (v === null || v === undefined) {
return 'null';
}
if (typeof v === 'object') {
if (v instanceof Array) {
return 'array';
}
if (v instanceof Date) {
return 'date';
}
return 'dict';
}
return typeof v;
}
你可以試試這個
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');
如果你想知道兩個對象是否都有相同的密鑰,那么如果沒有至少將兩個對象的密鑰轉換為帶有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');
}
在您的問題和評論中,您表明您只想驗證“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);
這是獲得密鑰的兩行,還有一行要檢查。 您只需要這兩項檢查中的一項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.