我有一个对象数组,如果某些数据匹配,我想在其中合并一些对象。这是阵列:
0: {name: "1", qty: "3", measurement: "Tbsp"}
1: {name: "paprika", qty: "2", measurement: "Tbsp"}
2: {name: "onion", qty: "1", measurement: "cup"}
3: {name: "tomatoes", qty: "16", measurement: "oz"}
4: {name: "tomatoes", qty: "16", measurement: "oz"}
我想根据名称和测量键进行匹配。即,如果name
相同且measurement
相同,则组合该对象并合计qty
,其中得到的对象为:
0: {name: "1", qty: "3", measurement: "Tbsp"}
1: {name: "paprika", qty: "2", measurement: "Tbsp"}
2: {name: "onion", qty: "1", measurement: "cup"}
3: {name: "tomatoes", qty: "32", measurement: "oz"}
我已经尝试过使用.includes()
和.some()
的几种方法,但还没有成功。感谢您的帮助。
这是数组reduce
方法的一个很好的用例。以下内容可用于确定我们的累加器是否已经具有所需项目。如果是,请添加数量。如果没有,则将该项推送到累加器数组中。
const items = [
{name: "1", qty: 3, measurement: "Tbsp"},
{name: "paprika", qty: 2, measurement: "Tbsp"},
{name: "onion", qty: 1, measurement: "cup"},
{name: "tomatoes", qty: 16, measurement: "oz"},
{name: "tomatoes", qty: 16, measurement: "oz"}
];
const combined = items.reduce((acc, el) => {
const found = acc.find(item => item.name === el.name && item.measurement === el.measurement);
if (found) {
found.qty += el.qty;
} else {
acc.push(el);
}
return acc;
}, []);
console.log(combined);
使用Map并连接名称和度量来创建唯一密钥的方法,使其看起来像"tomatoes|oz"
const groupItems = (arr) => {
const m = new Map;
arr.forEach(o => {
const k = `${o.name}|${o.measurement}`;
// if the key already exists just add current qty
// otherwise set new entry using current object
m.has(k) ? m.get(k).qty += o.qty : m.set(k, {...o});
});
return [...m.values()];
}
console.log(groupItems(data))
<script>
const data=[{name:"1",qty:3,measurement:"Tbsp"},{name:"paprika",qty:2,measurement:"Tbsp"},{name:"onion",qty:1,measurement:"cup"},{name:"tomatoes",qty:16,measurement:"oz"},{name:"tomatoes",qty:16,measurement:"oz"}];
</script>