Наиболее эффективный способ поиска различий (добавленных и удаленных пар) в двух хэшах JavaScript - PullRequest
0 голосов
/ 25 марта 2011

У меня есть два хэша строки JavaScript, объекты, называемые существующими элементами и новыми элементами. Я хочу сравнить и извлечь, какие элементы были добавлены (уникальны для newItems), а какие были удалены (уникальны для существующих элементов). Я хочу, чтобы сравнение было на ключе каждой пары.

Какой самый эффективный способ сделать это? Должен ли я сначала сортировать предметы? Стоит ли извлекать ключи для массивов и работать с ними в одиночку?

Пример хэшей:

var existing = [];
existing.push(["456",{Ref:"456",Title:"ttt456",food:"soup"}]);
existing.push(["789",{Ref:"789",Title:"ttt789",color:"blue",duck:"sauce"}]);
existing.push(["abc",{Ref:"abc",Title:"tttabc",colour:"yellklow",duck:"sauce"}]);
existing.push(["xyz",{Ref:"xyz",Title:"tttabc",colour:"yellklow",duck:"sauce"}]);
existing.push(["123",{Ref:"123",Title:"ttt123",pet:"cat"}]);

var newits = [];
newits.push(["abc",{Ref:"abc",Title:"tttabc",food:"horse"}]);
newits.push(["456",{Ref:"456",Title:"ttt456",pet:"cat",color:"green",cat:"sauce"}]);
newits.push(["def",{Ref:"def",Title:"tttabc",noise:"moo"}]);


var itemsAdded = compareHash(existing,newits);
var itemsRemoved =compareHash(newits,existing); 

1 Ответ

3 голосов
/ 25 марта 2011

Это не хэши, а массивы!(В Javascript объекты являются хешами).

Это можно сделать гораздо эффективнее, если переписать их следующим образом:

var existing = {};
existing["456"] = {Ref:"456",Title:"ttt456",food:"soup"};
existing["789"] = {Ref:"789",Title:"ttt789",color:"blue",duck:"sauce"};
existing["abc"] = {Ref:"abc",Title:"tttabc",colour:"yellklow",duck:"sauce"};
existing["xyz"] = {Ref:"xyz",Title:"tttabc",colour:"yellklow",duck:"sauce"};
existing["123"] = {Ref:"123",Title:"ttt123",pet:"cat"};

var newits = {};
newits["abc"] = {Ref:"abc",Title:"tttabc",food:"horse"};
newits["456"] = {Ref:"456",Title:"ttt456",pet:"cat",color:"green",cat:"sauce"};
newits["def"] = {Ref:"def",Title:"tttabc",noise:"moo"};

var itemsAdded = compareHash(existing,newits);
var itemsRemoved =compareHash(newits,existing); 

Теперь вы можете проверить наличиесуществование "abc" в newits примерно так:

if (newits.hasOwnProperty('abc')) {
    // do what you need to do
}

Чтобы просмотреть свойства вашего объекта (что они и сделали) - и ответить на ваш вопрос:

function compareHash(oldObj, newObj) {
    var result = {};
    for (var key in newObj) {
        if (newObj.hasOwnProperty(key)) { // filter in case someone else has added properties to the global Object prototype
            if (!oldObj.hasOwnProperty(key)) {
                result[key] = newObj[key];
            }
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...