Вы можете объединить map()
и reduce()
для достижения того, что вы ищете, что-то вроде:
let data = {
april: [{
quantity: "200",
date: "05/04/2020, 23:43",
price: "150",
product: "Washing Machine",
provider: "LG",
total: 30000,
},
{
quantity: "1000",
date: "10/04/2020, 00:35",
price: "800",
product: "Television",
provider: "Samsung",
total: 800000,
},
{
quantity: "3000",
date: "10/04/2020, 18:02",
price: "2",
product: "Computer",
provider: "Sony",
total: 600000,
},
{
quantity: "1000",
date: "10/04/2020, 18:03",
price: "300",
product: "Bluetooth Speaker",
provider: "Sony",
total: 300000,
},
],
march: [{
quantity: "400",
date: "18/03/2020, 23:47",
price: "230",
product: "Home Theatre",
provider: "Bose",
total: 92000,
}, ],
february: [{
quantity: "550",
date: "07/02/2020, 23:52",
price: "300",
product: "Printer",
provider: "Epson",
total: 165000,
},
{
quantity: "750",
date: "07/02/2020, 23:52",
price: "200",
product: "Television",
provider: "Panasonic",
total: 150000,
},
],
};
let aggregatedData = Object.keys(data).map((month) =>
data[month].reduce((acc, current, i) => {
let existing = acc.find((o) => o.provider === current.provider);
if (existing) {
existing.total += current.total;
} else {
acc[i] = { provider: current.provider, total: current.total };
}
return acc;
}, [])
);
let biggestProviders = aggregatedData.map((data) =>
data.reduce((p, c) => (c.total > p.total ? c : p))
);
console.log(biggestProviders);
console.log(biggestProviders.map(o => o.provider));
На основе ключей данных мы получаем массив данных компании за каждый месяц и сокращаем объекты, накапливая их итоги, если поставщик уже существует. Затем мы сопоставляем и сокращаем результирующие данные, сравнивая, какие из них имели наибольшее общее количество, а затем просто сопоставляем конечный результат, чтобы получить имя поставщика.
Крайний случай: У меня есть также заметил небольшую проблему с этим подходом, когда два провайдера имеют одинаковую общую сумму, поэтому я сделал небольшой фрагмент, который будет просто возвращать массив массивов провайдеров, которые так и имеют та же сумма Если мы не примем это во внимание, мы можем вернуть всего одного из крупнейших провайдеров:
let data = {
april: [{
quantity: "200",
date: "05/04/2020, 23:43",
price: "150",
product: "Washing Machine",
provider: "LG",
total: 30000,
},
{
quantity: "1000",
date: "10/04/2020, 00:35",
price: "800",
product: "Television",
provider: "Samsung",
total: 900000,
},
{
quantity: "3000",
date: "10/04/2020, 18:02",
price: "2",
product: "Computer",
provider: "Sony",
total: 600000,
},
{
quantity: "1000",
date: "10/04/2020, 18:03",
price: "300",
product: "Bluetooth Speaker",
provider: "Sony",
total: 300000,
},
],
march: [{
quantity: "400",
date: "18/03/2020, 23:47",
price: "230",
product: "Home Theatre",
provider: "Bose",
total: 92000,
}, ],
february: [{
quantity: "550",
date: "07/02/2020, 23:52",
price: "300",
product: "Printer",
provider: "Epson",
total: 165000,
},
{
quantity: "750",
date: "07/02/2020, 23:52",
price: "200",
product: "Television",
provider: "Panasonic",
total: 165000,
},
],
};
let aggregatedData = Object.keys(data).map((month) =>
data[month].reduce((acc, current, i) => {
let existing = acc.find((o) => o.provider === current.provider);
if (existing) {
existing.total += current.total;
} else {
acc[i] = {
provider: current.provider,
total: current.total
};
}
return acc;
}, [])
);
let biggestProviders = aggregatedData.map((data) =>
data.reduce((p, c) => {
if (p.length === 0) return p.concat(c);
if (c.total === p[0].total) {
p.push(c);
} else {
p = c.total > p[0].total ? Array.of(c) : Array.of(...p);
}
return p;
}, [])
);
console.log(biggestProviders);