Search code examples
javascriptnode.jsnestediterationjavascript-objects

JS Want to Iterate and set value of each key in a nested object to empty "", and create array of such objects


Base Object :

obj = {
    "place": "{{base_gplaceId}}",
    "feedInputs": [
        {
            "subCategoryQuestion": "{{base_gquestionId}}",
            "context": "other",
            "image": "abc.jpg",
            "mediaMetadata": {
                "stickerList": [
                    {
                        "id": "someid2",
                        "sticker": "delish",
                        "weight": 3
                    }
                ],
                "textList": [
                    {
                        "text": "What an evening!!!"
                    }
                ]
            }
        }
    ]
};

more keys can have more nesting,

want to set the values of keys = "", one by one and push the updated object to an array

Expected OP :

[
{"place":"","feedInputs":[{"subCategoryQuestion":"{{base_gquestionId}}","context":"other","image":"abc.jpg","mediaMetadata":{"stickerList":[{"id":"someid2","sticker":"delish","weight":3}],"textList":[{"text":"Whatanevening!!!"}]}}]},

{"place":"{{base_gplaceId}}","feedInputs":[{"subCategoryQuestion":"","context":"other","image":"abc.jpg","mediaMetadata":{"stickerList":[{"id":"someid2","sticker":"delish","weight":3}],"textList":[{"text":"Whatanevening!!!"}]}}]},

{"place":"{{base_gplaceId}}","feedInputs":[{"subCategoryQuestion":"{{base_gquestionId}}","context":"","image":"abc.jpg","mediaMetadata":{"stickerList":[{"id":"someid2","sticker":"delish","weight":3}],"textList":[{"text":"Whatanevening!!!"}]}}]},

{"place":"{{base_gplaceId}}","feedInputs":[{"subCategoryQuestion":"{{base_gquestionId}}","context":"other","image":"","mediaMetadata":{"stickerList":[{"id":"someid2","sticker":"delish","weight":3}],"textList":[{"text":"Whatanevening!!!"}]}}]},

{"place":"{{base_gplaceId}}","feedInputs":[{"subCategoryQuestion":"{{base_gquestionId}}","context":"other","image":"abc.jpg","mediaMetadata":{"stickerList":[{"id":"","sticker":"delish","weight":3}],"textList":[{"text":"Whatanevening!!!"}]}}]}
,...........]

tried couple of recursions, but not able to break after update inside the nested objects, any simplistic approach ?


Solution

  • You could iterate the properties and change the values who are not objects. For having access to the complete object store the root as well and take a copy of the object with stringify and parse for the result set.

    function visitAll(object, root = object) {
        return Object
            .keys(object)
            .flatMap(k => {
                if (object[k] && typeof object[k] === 'object') return visitAll(object[k], root);
                const value = object[k];
                object[k] = '';
                const result = JSON.parse(JSON.stringify(root));
                object[k] = value;
                return result;
            });
    }
    
    var object = { place: "{{base_gplaceId}}", feedInputs: [{ subCategoryQuestion: "{{base_gquestionId}}", context: "other", image: "abc.jpg", mediaMetadata: { stickerList: [{ id: "someid2", sticker: "delish", weight: 3 }], textList: [{ text: "What an evening!!!" }] } }] },
        result = visitAll(object);
    
    result.forEach(o => console.log(JSON.stringify(o)));
    .as-console-wrapper { max-height: 100% !important; top: 0; }