having a little bit of an issue trying to merge values in a 2d array.
For example:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
I want to sum up the 2nd param of the array if the first param are the same, so the end result being:
[
[4444, 10500],
[4455, 500],
];
i have tried the following but its continually adding to itself producing the wrong results:
formatBids.map(bid => {
const map = new Map([bid]);
formatBids.forEach(arr => (arr[1] += map.get(arr[0]) ?? 0));
});
unsure the best way to tackle this. Ideas?
You could just use an Object as a sort of map and use the first item in an array as the key. Then you can convert it back to an Array using Object.entries(). Like so:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const totals = {}
for (const bid of formatBids) {
totals[bid[0]] = (totals[bid[0]] || 0) + bid[1];
}
console.log("as object:", totals, "as array:", Object.entries(totals));
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
let merged = {}
formatBids.forEach((ele) => {
let key = parseInt(ele[0]);
merged[key] = (merged[key] ?? 0)+ele[1];
})
let mergedArr = Object.entries(merged);
console.log(mergedArr)
This is the another way of doing this
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
var mergedArr = formatBids.sort().reduce((currentArr, currentElement) => {
let n = currentArr.length;
if (n === 0) return [currentElement];
if (currentElement[0] === currentArr[n - 1][0]) {
currentArr[n - 1][1] += currentElement[1];
return currentArr;
} else return [...currentArr, currentElement];
}, []);
console.log(mergedArr)
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const result = Object.entries(formatBids.reduce((acc, [key, value]) => {
if (!acc[key]) acc[key] = value;
else acc[key] += value;
return acc;
}, {}));
console.log(result);