I have a JSON which has deep nested structure, I want a generic function in Javascript/Typescript to remove that multiple deep structure. Generic like there might me any parent other than categories
that may have nesting in its keys.
Here is an example JSON with deep nesting:-
const nestedObject = {
"code": {
"prev": [],
"current": null
},
"updatedAt": {
"prev": "2024-05-22T12:33:38.834Z",
"current": "2024-05-23T08:47:11.151Z"
},
"categories": {
"5": {
"prev": null,
"current": {
"id": 12,
"name": "Value-1"
}
},
"6": {
"prev": null,
"current": {
"id": 13,
"name": "Value-2"
}
},
"7": {
"prev": null,
"current": {
"id": 14,
"name": "Value-3"
}
},
"25": {
"24": {
"23": {
"22": {
"21": {
"20": {
"19": {
"18": {
"prev": null,
"current": {
"id": 25,
"name": "Value-3"
}
},
"prev": null,
"current": {
"id": 26,
"name": "Value-4"
}
},
"prev": null,
"current": {
"id": 27,
"name": "Value-5"
}
},
"prev": null,
"current": {
"id": 28,
"name": "Value-6"
}
},
"prev": null,
"current": {
"id": 29,
"name": "Value-7"
}
},
"prev": null,
"current": {
"id": 30,
"name": "Value-8"
}
},
"prev": null,
"current": {
"id": 31,
"name": "Value-9"
}
},
"prev": null,
"current": {
"id": 32,
"name": "Value-10"
}
}
}
};
In the example there’s deep nesting in the categories (i.e., 25->24->23->22->21…).
I want to make it like categories.3 and categories.4
Following is the Expected Output that I want the generic function to give:-
const expectedOutput = {
"code": {
"prev": [],
"current": null
},
"updatedAt": {
"prev": "2024-05-22T12:33:38.834Z",
"current": "2024-05-23T08:47:11.151Z"
},
"categories": {
"5": {
"prev": null,
"current": {
"id": 12,
"name": "Value-1"
}
},
"6": {
"prev": null,
"current": {
"id": 13,
"name": "Value-2"
}
},
"7": {
"prev": null,
"current": {
"id": 14,
"name": "Value-3"
}
},
"18": {
"prev": null,
"current": {
"id": 25,
"name": "Value-3"
}
},
"19": {
"prev": null,
"current": {
"id": 26,
"name": "Value-4"
}
},
"20": {
"prev": null,
"current": {
"id": 27,
"name": "Value-5"
}
},
"21": {
"prev": null,
"current": {
"id": 28,
"name": "Value-6"
}
},
"22": {
"prev": null,
"current": {
"id": 29,
"name": "Value-7"
}
},
"23": {
"prev": null,
"current": {
"id": 30,
"name": "Value-8"
}
},
"24": {
"prev": null,
"current": {
"id": 31,
"name": "Value-9"
}
},
"25": {
"prev": null,
"current": {
"id": 32,
"name": "Value-10"
}
}
}
};
I found a function that flattens the JSON. But this doesn’t give me the expected output. Here’s the function.
const flattenObject = (obj, prefix = '') => {
let result = {};
for (let key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
const nested = flattenObject(obj[key], `${prefix}${key}.`);
result = { ...result, ...nested };
} else {
result[`${prefix}${key}`] = obj[key];
}
}
return result;
};