2013-07-02 123 views
0

因此,比方说,我有对象A和对象B。对象A有许多子对象,其中对象B有许多相同的子对象。如何找出在对象B中缺少的差异和在对象A中添加的差异,然后将它们放入它们自己的对象或二维数组中。比较两个JavaScript对象

例如,第一阵列是那些被添加到第二,正在subracted:

var changes = [["google.com", "yahoo.com"],["facebook.com", "bing.com"]] 

我试图比较存储书签的快照,并使用crossrider当前的书签列表。

+1

你必须迭代和比较每个键/值对的字符串值(或其他)等。为了得到一些帮助,你将不得不张贴应该相互比较的对象,而不仅仅是你想结束的阵列。 – adeneo

回答

1

我相信这是从下面的问题一个遵循,所以我将它们全部组合成的背景范围内运行一个单一的代码示例(background.js): realtime with non-event programmingcrossrider: store snapshot of bookmarks in local database and compare to current bookmarks list

因此,对于getChanges函数,我倾向于将书签树转换为哈希列表,然后比较列表中的更改。在下面的例子中,我使用createHash创建使用cloneNode创建节点对象的浅克隆哈希表,然后在getChanges我比较散列表的添加,修改和删除:

appAPI.ready(function() { 
    // Poll every 30 seconds 
    setInterval(function() { 
    appAPI.db.async.get('prevBookmarks', function(value) { 
     // Load or initialize the previous bookmarks list 
     var prevBookmarks = (value) ? value : {}; 

     // Get current bookmarks 
     appAPI.bookmarks.getTree(function(nodes) { 
     // Save bookmark hash for comparison in next interval 
     appAPI.db.async.set('prevBookmarks', createHash(nodes[0])); 

     // Get hash list of curent bookmarks 
     var currBookmarks = createHash(nodes[0]); 

     // Get changes between the lists 
     var changes = getChanges(prevBookmarks, currBookmarks); 

     // Post changes to your API server 
     appAPI.request.post({ 
      url: http://yourAPIserver.com, 
      postData: changes, 
      contentType: 'application/json' 
     }); 
     }); 
    }); 
    }, 30 * 1000); 

    // Function to create a hash list from a bookmark tree 
    function createHash(node) { 
    var hash = {}; 
    if (typeof node === 'object') hash[node._id] = cloneNode(node); 

    if (node.isFolder && typeof node.children !== 'undefined' && node.children.length > 0) { 
     node.children.forEach(function(child) { 
     var childHash = createHash(child); 
     for (var key in childHash) { 
      if (!hash[key]) hash[key] = cloneNode(childHash[key]); 
     } 
     }); 
    } 
    return hash; 
    } 

    // Function to create shallow clones of bookmark nodes 
    function cloneNode(node) { 
    var clone = appAPI.JSON.parse(appAPI.JSON.stringify(node)); 
    delete clone.children; 
    delete clone.dateAdded; 
    return clone; 
    } 

    // Get changes between current and previous bookmark hash lists 
    function getChanges(prev, curr) { 
     // Initialize return object 
     var changes = {added:{}, modified:{}, removed:{}}; 

     // Search for added or modified nodes 
     for (var key in curr) { 
      if (!prev[key]) 
      changes.added[key] = curr[key]; 
      else if (appAPI.JSON.stringify(prev[key]) !== appAPI.JSON.stringify(curr[key])) 
      changes.modified[key] = curr[key]; 
     } 

     // Search for removed nodes 
     for (var key in prev) { 
      if (!curr[key]) 
      changes.removed[key] = prev[key]; 
     } 
     return changes; 
    } 
}); 

声明:我是Crossrider雇员

+0

感谢bro非常混淆了crossrider api – user2491588

0

如果要比较的两个对象均为一维数组,然后简单地使用在Underscore.js设定算术功能,如_.difference_.intersection

或者,使用相同的逻辑,这对于交叉(未优化)很简单,只要:

array1.filter(function(v){return array2.indexOf(v)!==-1);}); 

如果你正在寻找一种通用的方法找到任何深度的任意两个对象之间的差异复杂性,这不是一个明确定义的问题。