2017-05-20 111 views
1

正如標題所示,我正在尋找一種合併具有兩個相同鍵值對的數組中的對象的方法。例如,合併具有兩個相同鍵值對的數組中的對象

var ingredients = [ 
{name: 'egg',qty: 3,msr: large}, 
{name: 'egg',qty: 3,msr: large}, 
{name: 'egg',qty: 3,msr: tbsp}, 
{name: 'bacon',qty: 1,msr: cup} 
]; 

期望的結果:

ingredients = [ 
{name: 'egg',qty: 6,msr: large}, 
{name: 'egg',qty: 3,msr: tbsp}, 
{name: 'bacon',qty: 1,msr: cup} 
]; 

任何意見讚賞!

+0

請添加代碼,你試過。 –

+0

另一個對象在哪裏?請顯示你的代碼 – meteorzeroo

+1

你應該使用'array.reduce()' – Booster2ooo

回答

1

您可以嘗試使用Array#reduceArray#find結合來構建您的新陣列。

我會檢查你的對象是否存在或不由namemsr

見我的例子

var ingredients = [ 
 
{name: 'egg',qty: 3,msr: 'large'}, 
 
{name: 'egg',qty: 3,msr: 'large'}, 
 
{name: 'egg',qty: 3,msr: 'tbsp'}, 
 
{name: 'bacon',qty: 1,msr: 'cup'} 
 
]; 
 

 
result = ingredients.reduce((acc, el) => { 
 
    var existEl = acc.find(e => e.name == el.name && e.msr == el.msr); 
 
    
 
    if (existEl) { 
 
    existEl.qty = existEl.qty + el.qty; 
 
    } else { 
 
    acc.push(el); 
 
    } 
 
    
 
    return acc; 
 
}, []); 
 

 
console.log(result);

0

你可以這樣做:

  1. 創建密鑰的對象與您可以添加量array#forEach
  2. 創建ANS陣列通過迭代對象
    var ingredients = [ 
     
    {name: 'egg',qty: 3,msr: 'large'}, 
     
    {name: 'egg',qty: 3,msr: 'large'}, 
     
    {name: 'egg',qty: 3,msr: 'tbsp'}, 
     
    {name: 'bacon',qty: 1,msr: 'cup'} 
     
    ]; 
     
    
     
    var obj = {}; 
     
    ingredients.forEach(function (v,i) { 
     
        var key = v.name + ' '+v.msr; 
     
        if(!obj[key]) { 
     
        obj[key] = +v.qty; 
     
        } else { 
     
        obj[key] += +v.qty; 
     
        } 
     
    }); 
     
    
     
    //console.log(obj); 
     
    var ans = []; 
     
    for(var key in obj) { 
     
        var s = key.split(' '); 
     
        ans.push({name:s[0], qty:obj[key], msr:s[1]}); 
     
    } 
     
    console.log(ans);
0

你可以使用一個哈希表的關閉和聯合通緝值作爲重點。然後建立必要的新對象,然後調整數量。

var ingredients = [{ name: 'egg', qty: 3, msr: 'large' }, { name: 'egg', qty: 3, msr: 'large' }, { name: 'egg', qty: 3, msr: 'tbsp' }, { name: 'bacon', qty: 1, msr: 'cup' }]; 
 

 
ingredients = ingredients.reduce(function (hash) { 
 
    return function (r, o) { 
 
     var key = ['name', 'msr'].map(function (k) { return o[k]; }).join('|'); 
 
     if (!hash[key]) { 
 
      hash[key] = { name: o.name, msr: o.msr, qty: 0 }; 
 
      r.push(hash[key]); 
 
     } 
 
     hash[key].qty += o.qty; 
 
     return r; 
 
    }; 
 
}(Object.create(null)), []); 
 

 
console.log(ingredients);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相關問題