Home > Enterprise >  How to navigate and update fields inside a complex json object in node js?
How to navigate and update fields inside a complex json object in node js?

Time:01-10

How do I update the value of "message" belonging to "chatTemplateId":"5" and "mid":"b" to "Test2" in below json in node-js/javascript.I would have used LINQ in C# but not sure how to get this accomplished in the most optimised way in javascript/nodejs

{
    "chatTemplate" : "defaultTemplate",
    "chatTemplates" :[
        {
            "chatTemplateId": "5",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        },
        {
            "chatTemplateId": "4",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        }
    ]   
}

CodePudding user response:

I did using the Array.prototype.findIndex().

let a = {
    "chatTemplate" : "defaultTemplate",
    "chatTemplates" :[
        {
            "chatTemplateId": "5",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        },
        {
            "chatTemplateId": "4",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        }
    ]   
}

function updateMessage(obj,chatTemplateId,mid,message){
    let chatTemplateIndex = obj.chatTemplates.findIndex(i => i.chatTemplateId === chatTemplateId);
    let messageIndex = obj.chatTemplates[chatTemplateIndex].messages.findIndex(i => i.mid === mid);
    obj.chatTemplates[chatTemplateIndex].messages[messageIndex].message = message;
}

updateMessage(a,'5','b','Test2')

console.log(a)

EDIT: If want to update all messages with a given mid can try something like this

let a = {
    "chatTemplate" : "defaultTemplate",
    "chatTemplates" :[
        {
            "chatTemplateId": "5",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        },
        {
            "chatTemplateId": "4",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]        
        }
    ]   
}

function updateMessages(obj,mid,message){
    obj.chatTemplates.map((el)=> {
    let messageIndex = el.messages.findIndex(i => i.mid === mid);
    if(messageIndex!=-1){ //precaution if not all message arrays have the given mid value
         el.messages[messageIndex].message = message
    }
    return;
  })
 }

updateMessages(a,'b','Test2')

console.log(a)

CodePudding user response:

To access a single element of an array in place, use the find method and provide a callback that tests whether the element is the desired one.

const data =
{
    "chatTemplate" : "defaultTemplate",
    "chatTemplates" :[
        {
            "chatTemplateId": "5",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]
        },
        {
            "chatTemplateId": "4",
            "messages" : [
                {
                    "mid" : "a",
                    "message" : "Test1"
                },
                {
                    "mid" : "b",
                    "message" : "Test1"
                },
                {
                    "mid" : "c",
                    "message" : "Test1"
                },
                {
                    "mid" : "d",
                    "message" : "Test1"
                }
            ]
        }
    ]
};

data.chatTemplates
.find(obj => obj.chatTemplateId === '5').messages
.find(obj => obj.mid === 'b').message
= 'Test2';

console.log(data);

CodePudding user response:

You need to access the first object of the array, where chatTemplateId: 5. The first object is always at 0 index in the array. Then you access the messages array inside the chatTemplates array and select the second element which is at index 1.

chatTemplates[0].messages[1].message = "Test 2"
  •  Tags:  
  • Related