我有Set
个对象是这样嵌套的:
const mySet: Set<any> = new Set([
{
id: 1,
text: "hello",
success: true,
sub: {
id: 5,
text: 'hi',
success: true,
sub: {
id: 7,
text: 'hi ...',
success: true,
sub: {
id: 12,
text: 'hi :)',
success: false,
}
}
},
{
id: 2,
text: "hey",
success: true,
sub: null,
}
])
如您所见,id:1
有一个sub
,它也有自己的sub
,它是这样的。可能介于0到X之间。我想做的是,找到成功false
并将对象更改为null
并保留数组。
我尝试过了。这会发生变化:
mySet.forEach(s => {
s.text = "Override text"
})
// OR... This works for first element but what about recursively?
mySet.forEach(s => {
if(s.sub.success === false) s.sub = null
})
这样,我可以覆盖值。 forEach
使原始对象变异。但是,如何针对多个潜艇呢?我对此一无所知。
基本上,我想迭代sub
是否存在,然后递归迭代(如果找到),如果成功为null
,则将其设置为false
。
预期结果:
[
{
id: 1,
text: "hello",
success: true,
sub: {
id: 5,
text: 'hi',
success: true,
sub: {
id: 7,
text: 'hi ...',
success: true,
sub: null
}
},
{
id: 2,
text: "hey",
success: true,
sub: null,
}
]
有什么建议吗?
这是我到目前为止尝试过的。我将其放置在forEach
中,但这将替换所有对象,而不是找到的最后一个元素。
do {
if (sub.success === false) {
m.sub = null
} else {
m.sub = m.sub.sub
}
}
while (m.sub !== null)
答案 0 :(得分:1)
您可以创建将对象作为参数的函数。如果success
为假,则设置sub = null
。否则,如果对象具有非null的sub
属性,则递归调用obj.sub
对象上的函数。为数组中的每个项目调用此函数,或使用forEach
const input = new Set([{id:1,text:"hello",success:true,sub:{id:5,text:"hi",success:true,sub:{id:7,text:"hi ...",success:false,sub:{id:12,text:"hi :)",success:false,}}},},{id:2,text:"hey",success:true,sub:null,}]);
function checkSub(obj) {
if (!obj.success)
obj.sub = null
else if (obj.sub)
checkSub(obj.sub)
}
input.forEach(checkSub)
console.log([...input])
// Set won't be displayed in the snippet console
// so, converting it to an array for demo
答案 1 :(得分:0)
在m.sub = m.sub.sub
中,您将m.sub
用作“迭代变量”。请改用局部变量。
var obj = …;
while (obj.sub) {
if (!obj.sub.success) {
obj.sub = null;
} else {
obj = obj.sub;
}
}
您也可以将其写为
for (var obj = …; obj.sub; obj = obj.sub) {
if (!obj.sub.success) {
obj.sub = null;
break;
}
}