2016-03-23 3 views
0

Ich habe versucht, diese beiden Objekte so zu verschmelzen & hinzufügen:Javascript obejct fusionieren + hinzufügen Algorithmus

obj1 = { 
    jpg: 1, 
    gif: 3, 
} 

obj2 = { 
    jpg: 1, 
    avi: 5, 
} 

obj3 = mergeAdd(obj1, obj2); 
// obj3 = { 
// jpg: 2, 
// gif: 3, 
// avi: 5, 
// } 

Zuerst habe ich dies schaffen, die O nimmt (n^2) mag:

for (let foo in obj1) { 
    for (let bar in obj2) { 
    if (foo === bar) { 
     // Exists : Add count 
     obj1[bar] += obj2[bar]; 
    } else { 
     // Don`t Exists : Copy from obj2 
     obj1[bar] = obj2[bar]; 
    } 
    } 
} 

Und dann, eine ‚neue Idee‘ kam mir in den Sinn - Hash-Funktion:

  1. Hash-Wert für ‚Schlüssel‘ Get von obj1 & obj2.
  2. Geben Sie 'Wert' von obj1 ein & obj2 zu einem neuen Array, und verwenden Sie ihren Hash-Wert als Index des Arrays.
  3. Machen Sie das Array zu einem neuen Objekt.

Was ich möchte wissen:

  1. Gibt es eine Bibliothek, die Funktion haben wie mergeAdd (obj1, obj2)?
  2. Ist meine 'neue Idee' schneller als mergeAdd (obj1, obj2)?
  3. Was ist der schnellste Algorithmus für mergeAdd?

Vielen Dank!

+0

O (n log n) für das Zusammenführen und Sortierung. – jmugz3

Antwort

3

mit linearer Komplexität.

var obj1 = { jpg: 1, gif: 3, }, 
 
    obj2 = { jpg: 1, avi: 5, }, 
 
    merged = function (array) { 
 
     var r = {}; 
 
     array.forEach(function (a) { 
 
      Object.keys(a).forEach(function (k) { 
 
       r[k] = (r[k] || 0) + a[k]; 
 
      }); 
 
     }); 
 
     return r; 
 
    }([obj1, obj2]); 
 

 
document.write('<pre>' + JSON.stringify(merged, 0, 4) + '</pre>');

1

Können Sie ES6 verwenden? genommen https://jsbin.com/rogada/edit?js,console

aus: Sie können mit dem neuen Object.assign() -Methode dies ganz einfach:

let newObj = Object.assign({}, obj1, obj2); 

ohne ES6:

var newObj = {}; 
obj1 = { 
    jpg: 1, 
    gif: 3, 
}; 

obj2 = { 
    jpg: 1, 
    avi: 5, 
}; 
Object.keys(obj1).forEach(function(k) { 
    newObj[k] = obj1[k]; 
}); 
Object.keys(obj2).forEach(function(e) { 
    newObj[e] = obj2[e]; 
}); 

Arbeits Geige Eine Lösung http://es6-features.org/#ObjectPropertyAssignment

+1

nicht die gleiche Implementierung, OP wollen 'jpg == 2' – Hacketo

0

Eine generische rekursive/funktionale Lösung. Nimmt ein Array von Objekten und führt jedes in ein Ausgabeobjekt zusammen. Keine Ahnung, wie leistungsfähig es im Vergleich zu den anderen Antworten ist - es ist wahrscheinlich ziemlich schlecht.

function addValues(obj) { 
    return function (p, c) { 
    p[c] = (p[c] || 0) + obj[c]; 
    return p; 
    } 
} 

function mergeObject(obj, out) { 
    return Object.keys(obj).reduce(addValues(obj), out); 
} 

function processArray(arr, fn, out) { 
    out = out || {}; 
    if (!arr.length) return out; 
    out = fn(arr.shift(), out); 
    return processArray(arr, fn, out); 
} 

var arr = [{ jpg: 1, gif: 3 }, { jpg: 1, avi: 5, }]; 
processArray(arr, mergeObject); // { jpg: 2, gif: 3, avi: 5 } 

DEMO