2017-09-05 46 views
2

我需要比較兩個對象,並找出缺少哪些屬性。 對象相當大,有幾個層次。比較JS中的兩個對象屬性

我給對象的類型的短例如:

UC = {}; 
    UC.start = {} 
    UC.start.enableHardEccDecline = ''; 
    UC.start.template = {}; 
    UC.start.template.ecc = ''; 
    UC.start.template.decline = {}; 
    UC.start.template.decline.title = ''; 
    UC.start.template.decline.body = ''; 
    UC.general = {};... 

因此,這是一個例子對象。我需要比較的只是屬性。我不在乎價值。我將比較這個對象與另一個非常相似,但一些屬性可能會丟失。

+0

你會用這種比較做什麼?我們可以根據您的需求幫助提供解決方案,有關您最終目標的更多信息將對您有所幫助。 –

+2

您是否期待這是n級檢查? – Amit

+0

因此,一個對象是從服務器發送的,並攜帶多個字符串用於html內容。如果缺少一些屬性,我需要停止代碼,顯示錯誤頁面,並顯示缺少的所有屬性 –

回答

2

function compare(base, compared, deepSearch) { 
 
    var missing = []; 
 

 
    var compareProp = function (baseValue, comparedValue, path, deepSearch) { 
 
    //console.log('comparing', path.join('.')); 
 

 
    if (comparedValue === undefined) { 
 
     console.log('missing key', path.join('.')); 
 

 
     if (!deepSearch) { 
 
      return; 
 
     } 
 
    } 
 

 
    if (typeof baseValue === 'object') { 
 
     Object.keys(baseValue).forEach(function (key) { 
 
     compareProp(baseValue [key], comparedValue && comparedValue [key], path.concat(key), deepSearch); 
 
     }); 
 
    } 
 
    }; 
 

 
    Object.keys(base).forEach(function (key) { 
 
    compareProp(base [key], compared [key], [key], deepSearch); 
 
    }); 
 
} 
 

 
UC = {}; 
 
UC.start = {} 
 
UC.start.enableHardEccDecline = ''; 
 
UC.start.template = {}; 
 
UC.start.template.ecc = ''; 
 
UC.start.template.decline = {}; 
 
UC.start.template.decline.title = ''; 
 
UC.start.template.decline.body = ''; 
 
UC.general = {}; 
 

 
compare (UC, {}, true);

+0

謝謝,這完全符合我的需要:) –

-2

如果你的情況允許,我建議使用http://underscorejs.org/庫,而不是滾動你自己的解決方案(或去看看他們的實現)。在JS中,深度對象的比較有時不是微不足道的。 如果您決定推出您自己的解決方案,您可以遞歸地遍歷屬性並逐個比較它們(忽略本機/內置對象屬性並可能從某個原型繼承)。

如果你願意,我會很樂意詳細說明。

0

我剛剛作出了一個簡單的例子這裏,你不知道到底要如何應用這一點,但我已經添加缺少的項目到一個數組,這是記錄它。

Obj1應該是你的標準比較對象,obj2是從請求中收到的。

var obj1 = {}; 
obj1.test1 = 0; 
obj1.test2 = 0; 
obj1.test2222 = 0; 
obj1.testLoremIpsum = 0; 
obj1.lalala = 0; 

var obj2 = {}; 
obj2.test1 = 0; 
obj2.test25 = 0; 
obj2.lalala1 = 0; 

var k , i = 0; 
var missingProps = []; 

for(i in obj1) 
{ 
    var isFound = false; 
    for(k in obj2) if(i == k) isFound = true; 
    if(!isFound) missingProps.push(i); 
} 
console.log(missingProps); 
+0

這段代碼只會進入1級深度。示例數據具有更多級別。 –

+0

沒錯,我沒有注意到。將修改。謝謝! – gugateider