Here is what I'm trying to achieve:
I have this array:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "02", workstreamName: "Janine", amount: 135015 },
{ paidOn: "04", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "01", workstreamName: "Wang", amount: 198277 },
];
- I need to find all the "paidOn" keys that have a similar value and merge them.
- Use the workstreamName value as key and the amount value as the value for the new key.
So the output would look like this:
const data = [
{ paidOn:"01", "Leeann": 242759, "Wang": 198277 },
{ paidOn:"02", "Angelico": 58142, "Janine": 135015 },
{ paidOn:"03", "Zorine": 419310 },
{ paidOn:"04", "Shannon": 6396 }
];
So far I have managed to achieve step 2 with the following code but can't figure out how to achieve step 1:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "04", workstreamName: "Janine", amount: 135015 },
{ paidOn: "05", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "05", workstreamName: "Wang", amount: 198277 },
{ paidOn: "06", workstreamName: "Maurise", amount: 389081 },
{ paidOn: "07", workstreamName: "Nike", amount: 125030 },
{ paidOn: "08", workstreamName: "Teodor", amount: 142803 },
{ paidOn: "08", workstreamName: "Stefan", amount: 398831 },
{ paidOn: "09", workstreamName: "Fancy", amount: 353254 },
{ paidOn: "10", workstreamName: "Salli", amount: 492496 },
{ paidOn: "10", workstreamName: "Daniela", amount: 147206 },
{ paidOn: "11", workstreamName: "Tandy", amount: 362225 },
{ paidOn: "11", workstreamName: "Sidnee", amount: 381233 },
{ paidOn: "11", workstreamName: "Kordula", amount: 86582 },
{ paidOn: "12", workstreamName: "Dedra", amount: 443826 },
{ paidOn: "02", workstreamName: "Essy", amount: 449565 },
];
const workstreamNames = data.map((item) => {
return item.workstreamName
});
const amount = data.map((item) => {
return item.amount
});
const res = Object.fromEntries(workstreamNames.map((_, i) => [workstreamNames[i], amount[i]]))
console.log(res);
Here is what I'm trying to achieve:
I have this array:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "02", workstreamName: "Janine", amount: 135015 },
{ paidOn: "04", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "01", workstreamName: "Wang", amount: 198277 },
];
- I need to find all the "paidOn" keys that have a similar value and merge them.
- Use the workstreamName value as key and the amount value as the value for the new key.
So the output would look like this:
const data = [
{ paidOn:"01", "Leeann": 242759, "Wang": 198277 },
{ paidOn:"02", "Angelico": 58142, "Janine": 135015 },
{ paidOn:"03", "Zorine": 419310 },
{ paidOn:"04", "Shannon": 6396 }
];
So far I have managed to achieve step 2 with the following code but can't figure out how to achieve step 1:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "04", workstreamName: "Janine", amount: 135015 },
{ paidOn: "05", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "05", workstreamName: "Wang", amount: 198277 },
{ paidOn: "06", workstreamName: "Maurise", amount: 389081 },
{ paidOn: "07", workstreamName: "Nike", amount: 125030 },
{ paidOn: "08", workstreamName: "Teodor", amount: 142803 },
{ paidOn: "08", workstreamName: "Stefan", amount: 398831 },
{ paidOn: "09", workstreamName: "Fancy", amount: 353254 },
{ paidOn: "10", workstreamName: "Salli", amount: 492496 },
{ paidOn: "10", workstreamName: "Daniela", amount: 147206 },
{ paidOn: "11", workstreamName: "Tandy", amount: 362225 },
{ paidOn: "11", workstreamName: "Sidnee", amount: 381233 },
{ paidOn: "11", workstreamName: "Kordula", amount: 86582 },
{ paidOn: "12", workstreamName: "Dedra", amount: 443826 },
{ paidOn: "02", workstreamName: "Essy", amount: 449565 },
];
const workstreamNames = data.map((item) => {
return item.workstreamName
});
const amount = data.map((item) => {
return item.amount
});
const res = Object.fromEntries(workstreamNames.map((_, i) => [workstreamNames[i], amount[i]]))
console.log(res);
Would appreciate any help or pointer.
Share Improve this question edited Aug 8, 2021 at 21:55 Mister Jojo 22.6k6 gold badges25 silver badges44 bronze badges asked Aug 8, 2021 at 21:42 konstantforcekonstantforce 334 bronze badges 1-
it is not clear, are the
workstreamName
unique for the samepaidOn
, or do they have to be added together? – Mister Jojo Commented Aug 8, 2021 at 22:03
4 Answers
Reset to default 4Here's a way you can do it - this modifies this answer to return a custom dict:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "02", workstreamName: "Janine", amount: 135015 },
{ paidOn: "04", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "01", workstreamName: "Wang", amount: 198277 },
];
const key = "paidOn";
const result = Object.values(data.reduce(function(acc, x) {
const sub = (acc[x[key]] = acc[x[key]] || {"paidOn": x[key]});
sub[x["workstreamName"]] = x["amount"];
return acc;
}, {}));
console.log(result);
Note: This is a O(n) approach.
You could use Array.prototype.reduce()
like this:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "02", workstreamName: "Janine", amount: 135015 },
{ paidOn: "04", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "01", workstreamName: "Wang", amount: 198277 },
];
const result = data.reduce((acc, { paidOn, workstreamName, amount }) => {
const found = acc.find(x => x.paidOn === paidOn);
found ? found[workstreamName] = amount : acc.push({ paidOn, [workstreamName]: amount});
return acc;
}, []);
console.log(result);
You can do something like this:
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "02", workstreamName: "Janine", amount: 135015 },
{ paidOn: "04", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "01", workstreamName: "Wang", amount: 198277 },
{ paidOn: "01", workstreamName: "Wang", amount: 123 },
];
const result = {};
for (const { paidOn, workstreamName, amount } of data) {
let row = result[paidOn];
if (!row) row = result[paidOn] = {};
row[workstreamName] = (row[workstreamName] || 0) + amount;
}
console.log(result);
Two notes:
- Instead of having
{ paidOn: '', name1: 123, name2: 456 }
I've instead used an object like{ [paidOn]: { name1: 123, name2: 456 } }
to be easier to use later. This also prevents it from being wrong whenworkstreamName
ispaidOn
for some reason. - Mine takes the sum of same-name same-paidOn values, e.g.
Wang
in01
.
This might be helpful
const data = [
{ paidOn: "01", workstreamName: "Leeann", amount: 242759 },
{ paidOn: "02", workstreamName: "Angelico", amount: 58142 },
{ paidOn: "03", workstreamName: "Zorine", amount: 419310 },
{ paidOn: "04", workstreamName: "Janine", amount: 135015 },
{ paidOn: "05", workstreamName: "Shannon", amount: 6396 },
{ paidOn: "05", workstreamName: "Wang", amount: 198277 },
{ paidOn: "06", workstreamName: "Maurise", amount: 389081 },
{ paidOn: "07", workstreamName: "Nike", amount: 125030 },
{ paidOn: "08", workstreamName: "Teodor", amount: 142803 },
{ paidOn: "08", workstreamName: "Stefan", amount: 398831 },
{ paidOn: "09", workstreamName: "Fancy", amount: 353254 },
{ paidOn: "10", workstreamName: "Salli", amount: 492496 },
{ paidOn: "10", workstreamName: "Daniela", amount: 147206 },
{ paidOn: "11", workstreamName: "Tandy", amount: 362225 },
{ paidOn: "11", workstreamName: "Sidnee", amount: 381233 },
{ paidOn: "11", workstreamName: "Kordula", amount: 86582 },
{ paidOn: "12", workstreamName: "Dedra", amount: 443826 },
{ paidOn: "02", workstreamName: "Essy", amount: 449565 },
];
var result = data
.map(x => ({"paidOn": x.paidOn, [x.workstreamName]: x.amount}))
.reduce((t, x) => ({...t, [x.paidOn]: {...t[x.paidOn], ...x}}), {});