I’m trying to write this recursion function that will pivot an array of object so I am trying to use generics. The code actually works perfectly, but I cannot figure out how to make typescript happy. Here is my function:
<code>function groupFn<T extends {}>(arr: T[], fields: Array<keyof T>) {
if (fields.length === 0) return arr;
if (!Array.isArray(arr)) return arr;
const result = arr.reduce((acc: T[], item: T) => {
const trigger = item[fields[0]];
const fieldCopy = [...fields];
Object.keys(result).map((key: string) => {
const innerResults = groupFn(result[key], fieldCopy);
Object.keys(innerResults).map((inner, i) => {
const originalData = result[key];
result[key]["data"] = originalData;
result[key][inner] = innerResults[inner];
<code>function groupFn<T extends {}>(arr: T[], fields: Array<keyof T>) {
if (fields.length === 0) return arr;
if (!Array.isArray(arr)) return arr;
const result = arr.reduce((acc: T[], item: T) => {
const trigger = item[fields[0]];
if (!acc[trigger]) {
acc[trigger] = [];
}
acc[trigger].push(item);
return acc;
}, []);
const fieldCopy = [...fields];
fieldCopy.splice(0, 1);
fieldCopy.map(() => {
Object.keys(result).map((key: string) => {
const innerResults = groupFn(result[key], fieldCopy);
Object.keys(innerResults).map((inner, i) => {
if (i === 0) {
const originalData = result[key];
result[key] = {};
result[key]["data"] = originalData;
}
result[key][inner] = innerResults[inner];
});
});
});
return result;
}
</code>
function groupFn<T extends {}>(arr: T[], fields: Array<keyof T>) {
if (fields.length === 0) return arr;
if (!Array.isArray(arr)) return arr;
const result = arr.reduce((acc: T[], item: T) => {
const trigger = item[fields[0]];
if (!acc[trigger]) {
acc[trigger] = [];
}
acc[trigger].push(item);
return acc;
}, []);
const fieldCopy = [...fields];
fieldCopy.splice(0, 1);
fieldCopy.map(() => {
Object.keys(result).map((key: string) => {
const innerResults = groupFn(result[key], fieldCopy);
Object.keys(innerResults).map((inner, i) => {
if (i === 0) {
const originalData = result[key];
result[key] = {};
result[key]["data"] = originalData;
}
result[key][inner] = innerResults[inner];
});
});
});
return result;
}
Here is the error that I am getting:
I don’t understand because the trigger is key of each object in the array. Here is the small array of data:
{ name: "Alice", age: 28, town: "nashville", job: "manager" },
{ name: "Tom", age: 28, town: "hermitage", job: "manager" },
{ name: "Bob", age: 30, town: "nashville", job: "dev" },
{ name: "Eve", age: 28, town: "nashville", job: "dev" },
{ name: "Bill", age: 28, town: "nashville", job: "manager" },
{ name: "Tina", age: 30, town: "hermitage", job: "dev" },
{ name: "Evan", age: 30, town: "hermitage", job: "manager" },
{ name: "Cindy", age: 28, town: "hermitage", job: "manager" },
<code>const people = [
{ name: "Alice", age: 28, town: "nashville", job: "manager" },
{ name: "Tom", age: 28, town: "hermitage", job: "manager" },
{ name: "Bob", age: 30, town: "nashville", job: "dev" },
{ name: "Eve", age: 28, town: "nashville", job: "dev" },
{ name: "Bill", age: 28, town: "nashville", job: "manager" },
{ name: "Tina", age: 30, town: "hermitage", job: "dev" },
{ name: "Evan", age: 30, town: "hermitage", job: "manager" },
{ name: "Cindy", age: 28, town: "hermitage", job: "manager" },
];
</code>
const people = [
{ name: "Alice", age: 28, town: "nashville", job: "manager" },
{ name: "Tom", age: 28, town: "hermitage", job: "manager" },
{ name: "Bob", age: 30, town: "nashville", job: "dev" },
{ name: "Eve", age: 28, town: "nashville", job: "dev" },
{ name: "Bill", age: 28, town: "nashville", job: "manager" },
{ name: "Tina", age: 30, town: "hermitage", job: "dev" },
{ name: "Evan", age: 30, town: "hermitage", job: "manager" },
{ name: "Cindy", age: 28, town: "hermitage", job: "manager" },
];
and here is how I am calling the function:
<code>const result = groupFn(people, ["age", "town", "job"]);
<code>const result = groupFn(people, ["age", "town", "job"]);
</code>
const result = groupFn(people, ["age", "town", "job"]);
The data looks sweet. Here are all the people that are 28 (with all the data), split into devs and managers located in nashville and hermitage followed by the same for the people that are 30, etc:
If you could give any advice that would be greatly appreciated. I need the help of these experienced typescript developers.