2012-08-31 11 views
6

Ich habe derzeit 2 Obj und die Verwendung der Funktion jquery erweitern, aber es überschreibt Wert von Schlüsseln mit dem gleichen Namen. Wie kann ich die Werte stattdessen hinzufügen?

var obj1 = { 
    "orange": 2, 
    "apple": 1, 
    "grape": 1 
}; 

var obj2 = { 
    "orange": 5, 
    "apple": 1, 
    "banana": 1 
}; 

mergedObj = $.extend({}, obj1, obj2); 

var printObj = typeof JSON != "undefined" ? JSON.stringify : function (obj) { 
    var arr = []; 

    $.each(obj, function (key, val) { 
    var next = key + ": "; 
    next += $.isPlainObject(val) ? printObj(val) : val; 
    arr.push(next); 
    }); 

    return "{ " + arr.join(", ") + " }"; 
}; 

console.log('all together: ' + printObj(mergedObj)); 

Und ich obj1 = {"orange":5,"apple":1, "grape":1, "banana":1}

Was ich brauche, ist obj1 = {"orange":7,"apple":2, "grape":1, "banana":1}

Antwort

5

Alle $.extend tut, ist die zwei Objekte verbinden, aber es nicht fügen Sie die Werte, es Überschreibungen sie. Sie müssen dies manuell tun. $.extend wird nützlich sein, Früchte zu Ihrem Objekt hinzufügen oder ändern, aber wenn Sie die Gesamtsumme benötigen haben Sie gonna Schleife:

var obj1 = { orange: 2, apple: 1, grape: 1 }; 
var obj2 = { orange: 5, apple: 1, banana: 1 }; 
var result = $.extend({}, obj1, obj2); 
for (var o in result) { 
    result[o] = (obj1[o] || 0) + (obj2[o] || 0); 
} 
console.log(result); //=> { orange: 7, apple: 2, grape: 1, banana: 1 } 

Demo:http://jsfiddle.net/elclanrs/emGyb/

4

Working Demo

Das ist nicht, wie .extend() arbeitet; Sie implementieren müssen, um Ihre eigenen:

function mergeObjects() { 
    var mergedObj = arguments[0] || {}; 
    for (var i = 1; i < arguments.length; i++) { 
     var obj = arguments[i]; 
     for (var key in obj) { 
      if(obj.hasOwnProperty(key)) { 
       if(mergedObj[key]) { 
        mergedObj[key] += obj[key]; 
       } 
       else { 
        mergedObj[key] = obj[key]; 
       } 
      }     
     } 
    } 
    return mergedObj; 
} 

Verbrauch:

var obj1 = { "orange": 2, "apple": 1, "grape": 1 }; 
var obj2 = { "orange": 5, "apple": 1, "banana": 1 }; 
var mergedObj = mergeObjects(obj1, obj2); 
// mergedObj {"orange":7,"apple":2,"grape":1,"banana":1} 

Natürlich, wie .extend(), wird dies mit einer beliebigen Anzahl von Objekten arbeiten - nicht nur 2.

+1

Sehr schön, gerade JS auch Ich mag es! –

+1

Wenn Sie möchten, dass es etwas mit der jQuery-Funktionalität übereinstimmt, tun sie dies (mit Ihrem Code oben) 'mergedObject = Argumente [0] || {} ' –

+0

@anthony Danke, das ist definitiv eine effizientere Art, es zu tun, ich habe meinen Code oben aktualisiert :) – nbrooks

0

Hier einige Code könnten Sie verwenden:

obj1 = {"orange":2,"apple":1, "grape":1}; 
obj2 = {"orange":5,"apple":1, "banana":1}; 
var joined = {}; 

// add numbers in arr to joined 
function addItems(arr) { 

    // cycle through the keys in the array 
    for (var x in arr) { 

     // get the existing value or create it as zero, then add the new value 
     joined[x] = (joined[x] || 0) + arr[x]; 
    } 
} 

addItems(obj1); 
addItems(obj2); 
console.log(JSON.stringify(joined)); 

Ausgang:

{ "orange": 7, "apple": 2, "Traube": 1, "Banane": 1}

0

Kein fancy stuff, gerade einfach Javascript:

Die c[k] || 0 ist dort für den Fall, dass c[k] keinen Wert hat, wird es zu Null.

var a = {orange:2, apple:1, grape:1}; 
var b = {orange:5, apple:1, banana:1}; 
var c = {}; 
var k; 

for (k in a) {c[k] = 0 + a[k] + (c[k] || 0)} 
for (k in b) {c[k] = 0 + b[k] + (c[k] || 0)} 


window.alert(JSON.stringify(c)); 
Verwandte Themen