嗨,我正在尝试为单个对象中的多个动态数组和嵌套数组分配一个值。
这里是对象:
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",
},
]
}
下面是o / p
object = {
metaForm: [{
id: 1,
text: 'abc',
AdditionalVal: [],
isDisabled: true,
},
{
id: 1,
text: 'abc',
isDisabled: true,
AdditionalVal: [{
id: 1,
text: 'add',
isDisabled: true,
compositeConfig: []
}, ]
},
{
id: 1,
text: 'abc',
isDisabled: true,
AdditionalVal: [{
id: 1,
text: '123',
isDisabled: true,
compositeConfig: [{
id: 1,
text: 'composit',
isDisabled: true,
compositeConfig: []
}]
}, ]
}
],
tabData: [{
composite: false,
compositeFieldList: [],
id: 3576,
isDisabled: true,
tenantId: "1",
},
{
composite: false,
isDisabled: true,
compositeFieldList: [{
id: 1,
text: 'composit2',
isDisabled: true,
compositeConfig: []
},
{
id: 1,
text: 'composit3',
isDisabled: true,
compositeConfig: []
},
],
id: 3576,
tenantId: "1",
},
]
}
在上述对象中,分配了一个新值“ isDisabled:true”,该值被分配给所有数组以及内部或嵌套数组。
无论有多少个数组或嵌套的数组,如何为多个动态数组分配值
答案 0 :(得分:0)
那里没有魔术。
您应该只编写简单的递归。
这样的东西应该可以工作(伪代码):
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;
}
答案 1 :(得分:0)
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;
}
}
})
答案 2 :(得分:0)
编辑:错过了问题中的“嵌套数组”部分。
尝试:
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>