2016-03-23 24 views
0

algoritma + ekle birleştirme obejct: Ben O aldığı bu oluşturmak,JavaScript ben & böyle bu iki nesne eklemek birleştirmek çalışıyordu

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

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

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

İlk (n^2) sever:

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

  1. obj1arasında 'anahtar' için müzakere değerini alın: karma işlevi kullanılarak -

    Ve sonra, bir 'yeni bir fikir' aklıma gelenobj2.

  2. Nesnenin bir dizini olarak karma değerlerini kullanarak obj1 nesnesine 'value' değeriniobj2 ekleyin veya ekleyin.
  3. Diziyi yeni nesneye dönüştürün.

Bilmek istiyorum:

  1. mergeAdd gibi bir işleve sahip herhangi kitaplığı (obj1 obj2,) var mı?
  2. 'Yeni fikirim' mergeAdd'den (obj1, obj2) daha hızlı mı?
  3. MergeAdd yapmak için en hızlı algoritma nedir?

Teşekkürler!

+0

O (nlogn). – jmugz3

cevap

3

bir çözüm: https://jsbin.com/rogada/edit?js,console

alınan Doğrusal karmaşıklığı ile.

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

ES6 kullanıyor musunuz? Yeni Object.assign ile kolayca yapabilirsiniz() yöntemi:

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

ES6 olmadan:

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

çalışma keman: http://es6-features.org/#ObjectPropertyAssignment

+1

aynı uygulama değil, OP istiyorum 'jpg == 2' – Hacketo

0

genel bir yinelemeli/fonksiyonel çözüm. Bir dizi nesne alır ve her birini bir çıkış nesnesine birleştirir. Diğer cevaplarla karşılaştırıldığında ne kadar iyi performans gösterdiğini bilmiyoruz - muhtemelen oldukça kötü. birleştirme ve ayırma için

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