3 回答
TA贡献1813条经验 获得超2个赞
编辑:错过了问题中的“嵌套数组”部分。
试试这个:
function setProperty(object, key, value) {
if(Array.isArray(object)){
let newArray = [];
object.forEach((obj, index) => {
newArray.push(setProperty(obj, key, value));
});
return newArray;
} else if(typeof object === 'object' && object != null) {
object[key] = value;
Object.entries(object).forEach(item => {
if(Array.isArray(item[1])) {
let listKey = item[0];
let newList = setProperty(item[1], key, value);
object[listKey] = newList;
}
});
return object;
}
}
用法
setProperty(object, "isDisabled", true);
setProperty(object, "isDisabled", false);
setProperty(object, "someKey", "Some Value");
运行以下代码片段进行演示
function setProperty(object, key, value) {
if (Array.isArray(object)) {
let newArray = [];
object.forEach((obj, index) => {
newArray.push(setProperty(obj, key, value));
});
return newArray;
} else if (typeof object === 'object' && object != null) {
object[key] = value;
Object.entries(object).forEach(item => {
if (Array.isArray(item[1])) {
let listKey = item[0];
let newList = setProperty(item[1], key, value);
object[listKey] = newList;
}
});
return object;
}
}
function changeProp() {
let object = {
metaForm: [{
id: 1,
text: 'abc',
AdditionalVal: []
},
{
id: 1,
text: 'abc',
AdditionalVal: [{
id: 1,
text: 'add',
compositeConfig: []
}, ]
},
{
id: 1,
text: 'abc',
AdditionalVal: [{
id: 1,
text: '123',
compositeConfig: [{
id: 1,
text: 'composit',
compositeConfig: []
}]
}, ]
}
],
tabData: [{
composite: false,
compositeFieldList: [],
id: 3576,
tenantId: "1",
},
{
composite: false,
compositeFieldList: [{
id: 1,
text: 'composit2',
compositeConfig: []
},
{
id: 1,
text: 'composit3',
compositeConfig: []
},
],
id: 3576,
tenantId: "1",
},
]
};
document.getElementById("old").innerHTML = JSON.stringify(object, null, 4);
let name = document.getElementById("propertyName").value;
if (name == null || name == "")
name = "isDisabled"
setProperty(object, name, true);
document.getElementById("result").innerHTML = JSON.stringify(object, null, 4);
}
<div>
<h3> Enter the name of the property and click on the <strong>Set Property</strong> button.<br/> Default name is <i>isDisabled</i></h3>
<input type="text" id="propertyName" name="propertyName" placeholder="Property name" />
<button onclick="changeProp();">Set Property</button>
<h2>Object</h2>
<pre id="old">
</pre>
<br/>
<h2>Updated</h2>
<pre id="result">
</pre>
</div>
TA贡献1777条经验 获得超10个赞
object.metaForm.forEach(i => {
i.isDisabled = true;
if(i.AdditionalVal.length){
i.AdditionalVal.forEach(v => {
if.isDisabled = true;
})
}
});
object.tabData.forEach(i => {
i.isDisabled = true;
if(i.compositeFieldList.length){
i.compositeFieldList.forEach(c => {
c.isDisabled = true;
}
}
})
TA贡献1854条经验 获得超8个赞
那里没有神奇的方法。
你应该只写简单的递归。
这样的事情应该有效(伪代码):
function traverseAndSetDisabled(obj) {
if(Array.isArray(obj)) {
for(child in obj) obj[child] = traverseAndSetDisabled(child)
} else {
obj.isDisabled = true;
}
return obj;
}
[更新]
工作解决方案(结果与用户要求的结果 100% 相同)
function traverseAndSetDisabled(obj) {
if(typeof obj === 'object') {
for(const child in obj) obj[child] = traverseAndSetDisabled(obj[child])
if(!Array.isArray(obj)) {
obj.isDisabled = true;
}
}
return obj;
}
添加回答
举报