簡體   English   中英

在angular2中找到具有相同名稱的對象數組的值的總和

[英]Find the sum of values of array of objects with same name in angular2

我有一個要求,我需要在具有相同名稱的不同對象中找到amt的值之和。 下面是代碼片段

traveler = [
  {  description: 'Senior', Amount: 50},
   {  description: 'Senior', Amount: 50},
   {  description: 'Adult', Amount: 75},
   {  description: 'Child', Amount: 35},
   {  description: 'Infant', Amount: 25 },
];

在這里,我想用相同的描述計算不同對象中金額的總和。 例如:對象0和1包含相同的描述'Senior',因此總amt為100

如何在angular2中實現呢?

我應該使用內部forloops還是有更好的方法? 請幫我

您可以使用reduce將數組分組為一個對象。

 let traveler = [{"description":"Senior","Amount":50},{"description":"Senior","Amount":50},{"description":"Adult","Amount":75},{"description":"Child","Amount":35},{"description":"Infant","Amount":25}] let result = traveler.reduce((c, v) => { c[v.description] = (c[v.description] || 0) + v.Amount; return c; }, {}); console.log(result); 

您可以使用Map來收集值,並使用分組的結果渲染對象數組。

 var traveler = [{ description: 'Senior', amount: 50 }, { description: 'Senior', amount: 50 }, { description: 'Adult', amount: 75 }, { description: 'Child', amount: 35 }, { description: 'Infant', amount: 25 }], grouped = Array.from( traveler.reduce( (m, { description, amount }) => m.set(description, (m.get(description) || 0) + amount), new Map ).entries(), ([description, amount]) => ({ description, amount }) ); console.log(grouped); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

我認為您應該使用array#reduce方法執行以下操作:

 let traveler = [ { description: 'Senior', Amount: 50}, { description: 'Senior', Amount: 50}, { description: 'Adult', Amount: 75}, { description: 'Child', Amount: 35}, { description: 'Infant', Amount: 25 }, ]; function sumFinder(description) { return traveler.reduce((sum, e) => { (e.description == description) ? (sum += e.Amount) : (sum += 0) return sum; }, 0); } console.log(sumFinder('Senior')); 

使用Array.reduce()獲得以下輸出:

 var traveler = [ { description: 'Senior', Amount: 50}, { description: 'Senior', Amount: 50}, { description: 'Adult', Amount: 75}, { description: 'Child', Amount: 35}, { description: 'Infant', Amount: 25 }, ]; var res = traveler.reduce((acc, obj)=>{ var existItem = acc.find(item => item.description === obj.description); if(existItem){ existItem.Amount += obj.Amount; return acc; } acc.push(obj); return acc; }, []); console.log(res); 

您可以使用rxjs來實現:

travelers = [
      {  description: 'Senior', amount: 50},
      {  description: 'Senior', amount: 50},
      {  description: 'Adult', amount: 75},
      {  description: 'Child', amount: 35},
      {  description: 'Infant', amount: 25 }
    ];
//emit each person
const source = Rx.Observable.from(travelers);
//group by description
const example = source
  .groupBy(traveler => traveler.description)
  //return each item in group as array
  .mergeMap(group => group.toArray())
const reducer = (accumulator, currentValue) => {return accumulator + currentValue.amount};
const subscribe = example.subscribe(
  val => 
    console.log(
      {
        description: val[0].description, 
        amount: val.reduce( reducer, 0 )
      }
    )
);

此代碼的輸出是您想要的:

[object Object] {
  amount: 100,
  description: "Senior"
}
[object Object] {
  amount: 75,
  description: "Adult"
}
[object Object] {
  amount: 35,
  description: "Child"
}
[object Object] {
  amount: 25,
  description: "Infant"
}

最后,這是一個您可以使用的JSBin: http ://jsbin.com/kacoqulike/1/edit?js,console

使用Array.prototype.reduce和ES6對象分配解構的一種干凈簡單的解決方案:

const traveler = [{"description":"Senior","Amount":50},{"description":"Senior","Amount":50},{"description":"Adult","Amount":75},{"description":"Child","Amount":35},{"description":"Infant","Amount":25}]

const result = traveler.reduce((all, {description: d, Amount: a}) => {

    all[d] = (all[d] || 0) + a;
    return all;

}, {});

console.log(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM