【问题标题】:Modify collection while looping through it在循环中修改集合
【发布时间】:2020-04-10 07:48:48
【问题描述】:

我在 TypeScript 中有一组对象。每个对象都有一个名为getSubObjects 的方法,它返回包含相同方法getSubObjects 的相同类型对象的集合。我的要求是

  1. 必须遍历调用集合中每个对象的getSubObjects 的原始集合。
  2. 对于每个返回的对象,再次调用 getSubObjects
  3. 继续处理每个返回的对象,直到没有对象为止

所以在我的循环中,我想做如下的事情

objCol.forEach(item => {
  const col = item.getSubObjects();
  if(col){
      objCol.pushRange(col)
  }
});

我认为这在 TypeScript 中是不可能的,我能想到的唯一选择是诉诸递归,但如果有其他方法可以做到这一点,我宁愿避免使用它。

【问题讨论】:

  • 递归是你的朋友。然而,有很多库提供扁平化实用程序。 ramda 和 lodash 仅举两个例子。

标签: typescript collections


【解决方案1】:

您可以通过使用如下的简单循环来避免递归(尽管我自己没有运行 [pseudo] 代码):

首先为每个对象添加另一个布尔属性processed,初始化false。 那么:

const processedAll = () => !objCol.some(o => !o.processed);

while (!processedAll()) {
    const extension = [];
    objCol.forEach(item => {
        if (!item.isProcessed) {
            item.processed = true;
            const col = item.getSubObjects();
            if (col) {
                col.processed = false;
                extension.pushRange(col)
            }
        }
    });
    objCol = [...objCol, extension];
}

【讨论】:

  • 不能在一个简单的while循环中做到这一点,我尝试了一个while循环并尝试修改它,但它没有进入循环,似乎缓存了结果
  • 你试过我建议的代码了吗?在每次 while 循环迭代中,objCol 不包含额外推送的项?
  • 是的,这不起作用,在forEach 中您将一个项目推入其中,这会使程序卡住。
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2012-05-17
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多