开发者问题收集

如何在 Javascript 中更新嵌套对象数组中的键/值对

2021-12-09
314

这是我的数据结构:

[
    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
]

您好,我有一个查询,返回结果为:

thisIdRef: xxxxx, 
thisNewValue: newValue

是否可以将嵌套的“thisValue”更新为“thisNewValue”,其中“thisIdRef”等于“thisId”或“xxxxx”?

我使用 findIndex 和 splice 做了类似的事情,但这是针对非嵌套的键/值对,我无法弄清楚如何找到嵌套的 id,或者是否可能。

let newArray = oldArray;
const index = newArray.findIndex(post => post._id === editedPostId)
newArray.splice(index, 1, {
    ...newArray[index],
    post: editedContent
})

非常感谢您的帮助。

2个回答

我假设您想要创建一个新数组,这样原始数组及其嵌套结构就不会发生变化。

您可以使用以下函数:

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));

请注意,您给出的非嵌套结构代码 似乎 创建了一个新数组,但它仍然会改变原始数组。当您希望原始数组保持完整时,您必须小心地深度复制受影响的部分。

trincot
2021-12-09

一般形式为:

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

Steven Spungin
2021-12-09