2013-07-02 2 views
0

Итак, предположим, что у меня есть объект A и объект B. Объект A имеет число детей, где объект B имеет несколько детей, которые являются одинаковыми. Как узнать, каковы различия, отсутствующие в объекте B, и те, которые добавлены в объект A, а затем помещают их в свой собственный объект или двумерный массив.Сравнение двух объектов JavaScript

Например, первый массив является те, которые добавляются к второй, будучи вычитания из:

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

Я пытаюсь сравнить снимок сохраненных закладок и текущий список закладок с помощью crossrider.

+1

Вам необходимо выполнить итерацию и сравнить строковые значения (или что-то еще) каждой пары ключей/значений и т. Д. Чтобы получить некоторую помощь, вам придется публиковать объекты, которые должны быть сопоставлены друг с другом, а не только массив, в который вы хотите закончить. – adeneo

ответ

1

Я считаю, что это следовать на один из следующих вопросов, и поэтому я объединить их все в один пример кода, который работает в фоновом режиме рамки (background.js): realtime with non-event programming, crossrider: 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

спасибо, что очень сильно смущен кроссировщиком api – user2491588

0

Если оба сравниваемых объекта являются одномерные массивы, а затем просто использовать набор арифметических функций в Underscore.js, такие как _.difference и _.intersection.

Или использовать ту же логику, что для пересекаются (неоптимизированном) является столь же просто, как:

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

Если вы ищете обобщенный способ найти различий между любыми двумя объектами любой глубины и сложность, это не является четко определенной проблемой.

Смежные вопросы