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"
