繁体   English   中英

比较对象之间的属性子集

[英]Comparing a subset of properties between objects

我有一个非常幼稚的方法来比较两个对象的属性的子集。 当子集中有许多属性时,很难阅读。 有什么替代方案?

const obj1 = {a: 22, b: 33, c: 44};
const obj2 = {a: 22, b: 34, c: 44};

JSON.stringify([obj1.a, obj1.b]) === JSON.stringify([obj2.a, obj2.b]) 

子集比较SubsetCompare函数对两个对象的子集进行平面比较。

 let obj1 = {a: 22, b: 34, c: 44}; let obj2 = {a: 22, b: 34, c: 10}; let subsetCompare = (obj1, obj2, keys) => keys.every(key => obj1[key] === obj2[key]); console.log(subsetCompare(obj1, obj2, ['a', 'b'])); console.log(subsetCompare(obj1, obj2, ['a', 'b', 'c'])) 

平面比较flatCompare函数仅比较原始类型成员的值和引用类型成员的引用。

 let x = { a : 10}; let y = { a : 10}; let obj1 = {a: 22, b: 34, c: 44, d:y}; let obj2 = {a: 22, b: 34, c: 44, d:x}; let flatCompare = (obj1, obj2) => { let keys = []; if((keys = getKeys(obj1)).length != getKeys(obj2).length) return false; return keys.every(key => obj1[key] === obj2[key]); } let isObject = (obj) => obj === Object(obj); let getKeys = (obj) => Object.getOwnPropertyNames(obj); console.log(flatCompare(obj1, obj2)); 

深度比较deepCompare函数还递归比较嵌套对象的原始类型成员的值。

 let x = { a : 10}; let y = { a : 10}; let obj1 = {a: 22, b: 34, c: 44, d:y}; let obj2 = {a: 22, b: 34, c: 44, d:x}; let deepCompare = (obj1, obj2) => { let keys = []; if((keys = getKeys(obj1)).length != getKeys(obj2).length) return false; return keys.every(key => { if(isObject(obj1[key]) && isObject(obj2[key])) return deepCompare(obj1[key], obj2[key]); return obj1[key] === obj2[key]; }); }; let isObject = (obj) => obj === Object(obj); let getKeys = (obj) => Object.getOwnPropertyNames(obj); console.log(deepCompare(obj1, obj2)) 

为什么不使用功能?

 let obj1 = {a: 22, b: 33, c: 44}; let obj2 = {a: 22, b: 34, c: 44}; console.log(compareObjects(obj1, obj2, [`a`, `b`])); // false console.log(compareObjects(obj1, obj2, [`a`, `c`])); // true console.log(compareObjects(obj1, obj2, [`b`, `c`])); // false function compareObjects(obj1, obj2, keys) { let i; for (i = keys.length - 1; i > -1 && obj1[keys[i]] === obj2[keys[i]]; i--); return i === -1; // if i equals -1 it went through the whole loop and did not fail for the second condition } 

基于@revilheart的答案,但带有@Ryan的every建议:

 let obj1 = {a: 22, b: 33, c: 44}; let obj2 = {a: 22, b: 34, c: 44}; console.log(compareObjects(obj1, obj2, [`a`, `b`])); // false console.log(compareObjects(obj1, obj2, [`a`, `c`])); // true console.log(compareObjects(obj1, obj2, [`b`, `c`])); // false function compareObjects(obj1, obj2, keys) { return keys.every(key => obj1[key] === obj2[key]) } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM