我有一个要求,我需要在具有相同名称的不同对象中找到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中实现这一目标?
我应该使用内部forloop还是有更好的方法? 请帮助我
答案 0 :(得分:1)
您可以使用@Override
public void setZoomLayout(String imageUri) {
View view = getLayoutInflater().inflate(R.layout.layout_image_zoom, null);
ImageView zoomImage = view.findViewById(R.id.ivImageZoom);
zoomImage.setClickable(false);
zoomImage.setFocusable(false);
GlideApp.with(getActivity())
.load(imageUri)
.into(zoomImage);
dialogBuilder = new Dialog(getActivity(), -1);
dialogBuilder.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogBuilder.getWindow().setBackgroundDrawable(
new ColorDrawable(Color.TRANSPARENT));
dialogBuilder.setContentView(view);
dialogBuilder.show();
将数组分组为一个对象。
reduce
答案 1 :(得分:1)
您可以使用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; }
答案 2 :(得分: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'));
答案 3 :(得分:0)
使用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);
答案 4 :(得分:0)
您可以使用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
答案 5 :(得分:0)
使用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);