0

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.

4
  • 3
    Why is this tagged with reactjs. There is nothing specific to reactjs in this question. Commented Dec 9, 2021 at 6:58
  • 2
    Your array is not valid. Please check it and add valid array Commented Dec 9, 2021 at 7:02
  • Array item 1 = [0], array item 2 = [1] etc.. It's literally from the console log Commented Dec 9, 2021 at 7:05
  • The console log does not output valid JS. You should enter the structure in JavaScript syntax. Commented Dec 9, 2021 at 7:19

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

0

The general form would be:

const found = parentArray.find(it => it.array[0] === theId)
if (found) {
   found.array[1] = theValue
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.