将对象设置为null以匹配ES6 / TS中的通过突变设置中的匹配条件

时间:2019-07-08 19:53:06

标签: javascript typescript ecmascript-6

我有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)

2 个答案:

答案 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;
    }
}