如何修改嵌套对象的属性



假设我有以下带有嵌套对象的对象:

const obj = {
Visualization: {
Lower: [{ name: "Part", selectedValue: "60-000" }],
Upper: [{ name: "Part", selectedValue: "60-000" }],
},
Holder: {
Lower: [
{ name: "Part", selectedValue: "30-000" },
{ name: "Project Name", selectedValue: "45-000" },
],
Upper: [
{ name: "Part", selectedValue: "22-000" },
{ name: "Project Name", selectedValue: "25-000" },
],
},
};

我想同时将所有selectedValue更改为";0";并得到以下结果:

{
Visualization: {
Lower: [{ name: "Part", selectedValue: "0" }],
Upper: [{ name: "Part", selectedValue: "0" }],
},
Holder: {
Lower: [
{ name: "Part", selectedValue: "0" },
{ name: "Project Name", selectedValue: "0" },
],
Upper: [
{ name: "Part", selectedValue: "0" },
{ name: "Project Name", selectedValue: "0" },
],
},
}

我怎样才能把它做好?

谢谢!

function deepSet(o, propertyName, propertyValue) {
Object.keys(o).forEach(key => {
if (key === propertyName) {
o[key] = propertyValue;
return;
}
if (Array.isArray(o[key])) {
o[key].forEach(item => {
deepSet(item, propertyName, propertyValue);
});
return;
}
if (typeof o[key] !== 'object') {
return;
}
deepSet(o[key], propertyName, propertyValue);
});
}

JSFiddle:https://jsfiddle.net/713vfdrg/

您可以递归地处理此问题并更新原始对象。

我所做的只是检查对象是否是数组。如果是,则循环遍历数组并将每个对象selectedValue更新为0。这将更新这些键数组。

如果它不是一个数组,那么这意味着你正在处理一个对象,无论是父对象还是子对象,所以你在键上循环,并深入每个键的对象结构。

下面的函数假设数据将采用上面显示的格式。

const obj = {
Visualization: {
Lower: [{ name: "Part", selectedValue: "60-000" }],
Upper: [{ name: "Part", selectedValue: "60-000" }],
},
Holder: {
Lower: [
{ name: "Part", selectedValue: "30-000" },
{ name: "Project Name", selectedValue: "45-000" },
],
Upper: [
{ name: "Part", selectedValue: "22-000" },
{ name: "Project Name", selectedValue: "25-000" },
],
},
};
function updateSelectedValue(obj, keyToUpdate, valueUpdate) {
if(Array.isArray(obj)){
obj.forEach((content, idx) => {
if(obj[idx][keyToUpdate]){
obj[idx][keyToUpdate] = valueUpdate;
}
})
return;
}
const keys = Object.keys(obj);
for(const key in obj){
updateSelectedValue(obj[key], keyToUpdate, valueUpdate);
}
}
updateSelectedValue(obj, "selectedValue", 0)
console.log(obj)

最新更新