2012-08-31 18 views
6

Şu anda 2 obj var ve jquery extend işlevini kullanıyorum, ancak aynı ada sahip tuşlardan değeri geçersiz kılıyor. Bunun yerine değerleri nasıl bir araya getirebilirim?Aynı ada sahip anahtarlardan birlikte sayısal değerler ekleyerek 2 nesneyi nasıl.

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)); 

Ve ben gerekenler

obj1 = {"orange":5,"apple":1, "grape":1, "banana":1} olsun tüm $.extend yapar obj1 = {"orange":7,"apple":2, "grape":1, "banana":1}

cevap

5

iki nesneleri birleştiren olduğunu ama değerleri, bu geçersiz kılar bunları eklemez. Bunu manuel olarak yapmanız gerekecek. $.extend sizin nesneye meyve eklemek veya değiştirmek için yararlı olacağını ancak toplamını gerekiyorsa yapacaksın döngü vardır:

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

değil nasıl .extend() Eserleri; Eğer uygulamak gerekecek kendi:

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; 
} 

Kullanımı: Elbette

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} 

, .extend() gibi bu nesnelerin herhangi bir sayı ile çalışacak - sadece 2.

+1

Çok güzel, düz JS de beğeniyorum! –

+1

Eğer jquery işlevselliği ile biraz eşleştirmek istiyorsanız, etkili bir şekilde (yukarıdaki kodunuzu kullanarak) 'mergedObject = arguments [0] || {} ' –

+0

@anthony Teşekkürler, kesinlikle bunu yapmanın daha verimli bir yolu, yukarıdaki kodumu güncelledim :) – nbrooks

0

burada ' bazı kod kullanabilirsiniz:

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)); 

Çıktı:

{ "turuncu": 7, "elma": 2, "üzüm": 1, "muz": 1}

0

Hiçbir fantezi şeyler, sadece basit JavaScript:

c[k] || 0, c[k]'un değeri olmadığı durumda, sıfır olur.

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)); 
İlgili konular