function groupSum(arr, key, ...sumKeys) {
const getKey = key instanceof Function ? key : n => n[key];
return Object.values(arr.reduce((acc, n) => {
const item = acc[getKey(n)] ??= Object.assign(
structuredClone(n),
Object.fromEntries(sumKeys.map(k => [ k, 0 ]))
);
sumKeys.forEach(k => item[k] += n[k]);
return acc;
}, {}));
}
// ваш случай
groupSum(arr, 'product', 'price', 'selling_price', 'quantity')
// элементам исходного массива не обязательно быть объектами,
// это могут быть и массивы
groupSum([
[ 'A', 1, 10 ],
[ 'A', 2, 20 ],
[ 'A', 3, 30 ],
[ 'B', 1, 5 ],
[ 'B', 10, 5 ],
[ 'B', 100, 5 ],
], 0, 1, 2) // [ [ 'A', 6, 60 ], [ 'B', 111, 15 ] ]