2016-01-20 94 views
1

讓我們有一些默認設置的對象:遞歸減去兩個JavaScript對象

var defaults = { 
    id: '', 
    x: 0, 
    y: 0, 
    width: 20, 
    height: 20, 
    styles: { 
     color: '#ffffff', 
     background_color: '#000000' 
    }, 
    points: [] 
} 

然後,我們做我們自己的對象,最初擴展了默認設置,並做了一些變更:

var newObject = { 
    id: '1', // changed 
    x: 10, // changed 
    y: 10, // changed 
    width: 20, 
    height: 20, 
    styles: { 
     color: '#ffffff', 
     background_color: '#333333' // changed 
    }, 
    points: [1, 2, 3] 
} 

最後,我們需要一個對象,其中只包含從默認設置更改的值,如下所示:

var subtracted = { 
    id: '1', 
    x: 10, 
    y: 10, 
    styles: { 
     background_color: '#333333' 
    }, 
    points: [1, 2, 3] 
} 

算法需要遞歸,對象內可以有對象。這是我到目前爲止:

function subtract(a, b) { 
    var r = {}; 

    // For each property of 'b' 
    // if it's different than the corresponding property of 'a' 
    // place it in 'r' 
    for (var key in b) { 
     if (typeof(b[key]) == 'object') { 
      if (!a[key]) a[key] = {}; 
      r[key] = subtract(a[key], b[key]); 
     } else { 
      if (b[key] != a[key]) { 
       r[key] = a[key]; 
      } 
     } 
    } 

    return r; 
} 

但是,遞歸不適用於數組,所以「點」結果是一個空對象! typeof()將它檢測爲一個對象,但無法克隆它的屬性。

https://jsfiddle.net/gd8q1u18/1/

回答

2

您的代碼正在工作。雖然有一個我編輯的編輯器也可以遞歸。

var defaults = { 
 
     id: '', 
 
     x: 0, 
 
     y: 0, 
 
     width: 20, 
 
     height: 20, 
 
     styles: { 
 
      color: '#ffffff', 
 
      background_color: '#000000' 
 
     }, 
 
     points: [] 
 
    } 
 

 
    var newObject = { 
 
     id: '1', // changed 
 
     x: 10, // changed 
 
     y: 10, // changed 
 
     width: 20, 
 
     height: 20, 
 
     styles: { 
 
      color: '#ffffff', 
 
      background_color: '#333333' // changed 
 
     }, 
 
     points: [0, 1, 2] // changed 
 
    } 
 

 
    var subtracted = { 
 
     id: '1', 
 
     x: 10, 
 
     y: 10, 
 
     styles: { 
 
      background_color: '#333333' 
 
     } 
 
    } 
 
    function isSame(a,b) { 
 
     if(a.length != b.length) return false; 
 
     if(a.filter(function(i) {return a.indexOf(i) < 0;}).length > 0) 
 
     return false; 
 
     if(b.filter(function(i) {return a.indexOf(i) < 0;}).length > 0) 
 
     return false; 
 
     return true; 
 
    }; 
 
    function subtract(a, b) { 
 
     var r = {}; 
 

 
     // For each property of 'b' 
 
     // if it's different than the corresponding property of 'a' 
 
     // place it in 'r' 
 
     for (var key in b) { 
 
      if (Array.isArray(b[key])) { 
 
       if(!a[key]) a[key] = []; 
 
       if(!isSame(a[key],b[key])) 
 
        r[key] = a[key]; 
 
      } else if (typeof(b[key]) == 'object') { 
 
       if (!a[key]) a[key] = {}; 
 
       r[key] = subtract(a[key], b[key]); 
 
      } else { 
 
       if (b[key] != a[key]) { 
 
        r[key] = a[key]; 
 
       } 
 
      } 
 
     } 
 
     return r; 
 
    } 
 

 
    console.log(subtract(newObject, defaults));

+0

哦,這是一個愚蠢的錯誤:) –

+0

哈哈..它發生:) – Sachin

+0

接受的答案??? – Sachin