blog

JSは2つのオブジェクトが等しいかどうかを判断する

1. 文字列比較 2. 浅い比較 3. 深い比較...

Mar 4, 2020 · 2 min. read
Share this

序文

プロジェクトの最適化を行うには、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;
}
Read next

[準備] JAVAの基礎

シリアライズとは、オブジェクトをバイト列に変換することです。 テキスト、画像、音声、動画などのネットワーク伝送の場合

Mar 3, 2020 · 5 min read