this is my data structure:
[ 0: key1: value, key2: value, array: 0: thisId: xxxxx, thisValue: value, 1: notThisId: someId, notThisValue: value, key3: value 1: key1: value key2: value array: 0: anotherId: id anotherValue: value key3: value ]
Hello, I have a query with is returning:
thisIdRef: xxxxx, thisNewValue: newValue
Is it possible to update the nested ‘thisValue’ to ‘thisNewValue’ where ‘thisIdRef’ is equal to ‘thisId’, or ‘xxxxx’?
I have done something similar below using findIndex and splice, but this is for a non-nested key/value pair and I can’t work out how to find a nested id, or indeed if it’s possible.
let newArray = oldArray; const index = newArray.findIndex(post => post._id === editedPostId) newArray.splice(index, 1, { ...newArray[index], post: editedContent })
Any help very much appreciated.
Advertisement
Answer
I will assume you want to create a new array, such that the original array and its nested structure is not mutated.
Here is a function that you could use:
function setDeep(original, editedPostId, editedContent) { return original.map(obj => { let i = obj.array.findIndex(item => item.thisId === editedPostId); if (i == -1) return obj; return { ...obj, array: Object.assign([], obj.array, { [i]: { ...obj.array[i], thisId: editedPostId, thisValue: editedContent } }) }; }); } // Example call let original = [{ key1: 1, key2: 2, array: [{ thisId: "xxxxx", thisValue: 3, }, { notThisId: "yyyy", notThisValue: 4, }], key3: 5 }, { key1: 6, key2: 7, array: [{ anotherId: "zzzzz", anotherValue: 8 }], key3: 9 }]; let editedPostId = "xxxxx"; let editedContent = 42; console.log(setDeep(original, editedPostId, editedContent));
Note that the code you have given for a non-nested structure seems to create a new array, but it still mutates the original array. When you want the original to remain in tact, you have to take care to deep-copy the parts that are affected.