Hello to all i have this data structure that i need to group and if there are any duplicates to convert those two objects it in one line..
Data Structure
JavaScript
x
7
1
var shipTo = [
2
{ addressLine1: "address 1", name: "Jeff" },
3
{ addressLine1: "address 2", name: "Taylor" },
4
{ addressLine1: "address 1", name: "Megan" },
5
{ addressLine1: "address 3", name: "Madison" },
6
];
7
Grouped function
JavaScript
1
7
1
function groupArrayOfObjects(list, key) {
2
return list.reduce(function (rv, x) {
3
(rv[x[key]] = rv[x[key]] || []).push(x);
4
return rv;
5
}, {});
6
}
7
I have groupedBy address attrube by this function above by address
JavaScript
1
2
1
const groupedAddress = groupArrayOfObjects(shipTo, "addressLine1");
2
My new data-structure is
My final Result wanna be like this :
Shipping Address for Shipment 1 & 3 is "address 1"
Shipping Address for Shipment 2 is "address 2"
Advertisement
Answer
reduce
can take the index of the current array element as the 3rd parameter. you can then pass it to your accumulator and in the final array can do what you want with it
JavaScript
1
24
24
1
var shipTo = [
2
{ addressLine1: "address 1", name: "Jeff" },
3
{ addressLine1: "address 2", name: "Taylor" },
4
{ addressLine1: "address 1", name: "Megan" },
5
{ addressLine1: "address 3", name: "Madison" },
6
];
7
8
function groupArrayOfObjects(list, key) {
9
return list.reduce(function (rv, x, idx) {
10
(rv[x[key]] = rv[x[key]] || []).push({x, index:idx+1});
11
return rv;
12
}, {});
13
}
14
15
const groupedAddress = groupArrayOfObjects(shipTo, "addressLine1");
16
console.log(groupedAddress)
17
18
19
//for completeness
20
Object.values(groupedAddress).forEach((address) => {
21
let addressName = address[0].addressLine1
22
let joinedIndices = address.map(({index}) => index).join(" & ")
23
console.log(`Shipping Address for Shipment ${joinedIndices} is "${addressName}"`)
24
})