如何在 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