在数据匹配的数组中合并JavaScript对象



我有一个对象数组,如果某些数据匹配,我想在其中合并一些对象。这是阵列:

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>

最新更新