序文
プロジェクトの最適化を行うには、2つのオブジェクトが一貫性のあるロジックであるかどうかを判断するために使用する必要があるので、彼らは少しを書くためにロジックについてお照会ください、そして今、それは自分の将来のアクセスのための文書として書かれます
文字列比較
これは、2つのプロパティの順序が完全に同じであるオブジェクトにのみ適用されます。
function c(bar, obj) {
return JSON.stringify(bar) === JSON.stringify(obj);
}
浅い比較
配列、オブジェクト、メソッドをスキップして、最初のレベルのデータ・クエリのみを実行します。
es6のあらゆる機能による最適処理
// 2. shallow compare
function isObjShallowEqual(obj1, obj2) {
const keys1 = Object.getOwnPropertyNames(obj1);
const keys2 = Object.getOwnPropertyNames(obj2);
if (keys1.length !== keys2.length) {
return false;
}
const flag = keys1.every(key => {
const type = typeof obj1[key];
// do not check function, array, object
if (['function', 'array', 'object'].includes(type)) {
return type === typeof obj2[key];
}
// if unequal, return true
if (obj1[key] !== obj2[key]) {
return false;
}
return true;
});
// if found unequal, then return false, which means unequal
return flag;
}
深い比較
配列とオブジェクトの比較では、2 番目のサブセットのみが比較され、配列またはオブジェクトのセット内の配列は処理されません。
// 3. deep compare
function isObjDeepEqual(obj1, obj2) {
const KEY = {
OBJECT: 'object',
ARRAY: 'array',
FUNCTION: 'function',
};
const keys1 = Object.getOwnPropertyNames(obj1);
const keys2 = Object.getOwnPropertyNames(obj2);
if (keys1.length !== keys2.length) {
return false;
}
const flag = keys1.every(key => {
const TYPE = typeof obj1[key];
// escape null && self-call the function
if (!!obj1[key] && TYPE === KEY.OBJECT) {
return isObjDeepEqual(obj1[key], obj2[key]); // the recursion of funciton call
}
// array's case
if (TYPE === KEY.ARRAY) {
// check the length
if (obj1[key].length !== obj2[key].length) {
return false;
}
return obj1[key].every((child, index) => {
const CHILD_TYPE = typeof child;
// skip more deep compare, limit to 2
if ([KEY.ARRAY].includes(CHILD_TYPE)) {
return true;
}
// if function or object, then self-call
if ([KEY.OBJECT, KEY.FUNCTION].includes(CHILD_TYPE)) {
const OBJ2_CHILD = obj2[key][index];
if (CHILD_TYPE !== typeof OBJ2_CHILD) {
return false;
}
return isObjDeepEqual(child, OBJ2_CHILD);
}
// Normal value check
if (child !== obj2[key][index]) {
return false;
}
return true;
});
}
// convert function to string, then compare the value
if (TYPE === KEY.FUNCTION) {
return obj1[key].toString() === obj2[key].toString();
}
// if unequal, return true
if (obj1[key] !== obj2[key]) {
return false;
}
return true;
});
// if found unequal, then return
return flag;
}