I’m having trouble converting, summing, and sorting the following arrays into key and value objects
Data Array
0: {No: '1', Product Name: 'Harry Potter', Type: 'Novel', Price: '120', Url: 'https://harry-potter'}
1: {No: '2', Product Name: 'Harry Potter', Type: 'Novel', Price: '100', Url: 'https://harry-potter'}
2: {No: '3', Product Name: 'Naruto', Type: 'Comic', Price: '68', Url: 'https://naruto'}
n: {No: '...', Product Name: '...', Type: '...', Price: '...', Url: '...'}
my current code
let counts = myRows.reduce((prev, curr) => {
let count = prev.get(curr["Product Name"]) || 0;
prev.set(
curr["Product Name"],
parseFloat(curr["Product Name"]) + count,
curr["Url"]
);
return prev;
}, new Map());
// then, map your counts object back to an array
let reducedObjArr = [...counts].map(([key, value, link]) => {
return { key, value, link };
});
// SORT BY DESCENDING VALUE
var desc = reducedObjArr.sort((a, b) => b.value - a.value);
console.log(desc);
and the result of my current code
0: key: "Harry Potter" link: undefined value: 220 1: key: "Naruto" link: undefined value: 68
though, the result I want is like this
0: key: "Harry Potter" link: "https://harry-potter" value: 220 1: key: "Naruto" link: "https://naruto" value: 68
Advertisement
Answer
Map.prototype.set() only takes 2 arguments, you’re passing 3. If you want to store multiple values in a map key, store them as an array or object. In my code below, I store [price, url].
Another problem is that you were trying to parse curr["Product Name"] as the price, but it should be curr.Price.
const myRows = [
{No: '1', "Product Name": 'Harry Potter', Type: 'Novel', Price: '120', Url: 'https://harry-potter'},
{No: '2', "Product Name": 'Harry Potter', Type: 'Novel', Price: '100', Url: 'https://harry-potter'},
{No: '3', "Product Name": 'Naruto', Type: 'Comic', Price: '68', Url: 'https://naruto'}
];
let counts = myRows.reduce((prev, curr) => {
let count = prev.get(curr["Product Name"])?.[0] || 0;
prev.set(
curr["Product Name"],
[parseFloat(curr.Price) + count,
curr.Url
]
);
return prev;
}, new Map());
// then, map your counts object back to an array
let reducedObjArr = [...counts].map(([key, [value, link]]) => {
return {
key,
value,
link
};
});
// SORT BY DESCENDING VALUE
var desc = reducedObjArr.sort((a, b) => b.value - a.value);
console.log(desc);