正如标题所暗示的,我正在寻找一种方法来合并数组中具有两个相同键值对的对象。例如,
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}
];任何建议都很感谢!
发布于 2017-05-20 17:33:05
您可以尝试结合使用Array#reduce和Array#find来构建新的数组。
我会用name和msr检查你的对象是否存在。
请看我的例子
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);
发布于 2017-05-20 17:37:47
您可以这样做:
array#forEach 发布于 2017-05-20 18:11:48
您可以使用哈希表作为闭包,并将所需的值连接为键。然后,如果需要,构建一个新对象,并在以后调整数量。
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; }
https://stackoverflow.com/questions/44084150
复制相似问题