如何迭代具有嵌套子对象键的对象?

3

我希望能够遍历嵌套的对象键,其中可能还有内部的子嵌套:

嵌套对象代码:

{
    "F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
        "D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
            "child": {
                "87A1817D-CFA9-70FD-131B-224658AF13CE": {
                    "next": {
                        "F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
                    }
                }
            },
            "next": {
                "B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
                    "next": {}
                }
            }
        }
    }
}

用于迭代的JS代码:

flowThrough = (obj, callback, context?, path?: string) => {
    let nestedKey=';'
    Object.keys(obj).forEach(key => {
      if(!isEmptyObject(key))
      callback(key, context, path);

      if (!isEmpty(obj[key]) && typeof obj[key] === 'object') {
        if(obj[key].hasOwnProperty('next'))
        nestedKey = obj[key].next;
        else if(obj[key].hasOwnProperty('child'))
        nestedKey = obj[key].child;
        else  nestedKey = obj[key];

        this.flowThrough(nestedKey, callback, context, (path)? has(context, path.concat(".next"))?path.concat(`.next[${get(context, path.concat(".next").length)}]`): path.concat('.').concat("next[0]") : key)
      }
    })
  }

实际上,上面的代码可以用于获取一个嵌套级别中的键(ids)。如果它达到空对象键,则循环会在那里结束。实际上,它应该检查是否存在任何其他子项/下一个子项。

预期输出:

{  "flow": [
    {
      "id": "F2C3C496-BEA6-A5E8-15F0-E2867304B463",
      "next": [
        {
          "id": "D39FD497-9529-6CC3-70DE-E8D9277C18D3",
          "child": [
            {
              "id": "87A1817D-CFA9-70FD-131B-224658AF13CE",
              "next": [
                {
                  "id": "F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A",
                  "next": []
                }
              ]
            }
          ],
          "next": [
            {
              "id": "B49927ED-369E-E219-FC1A-8E4BAAFC3933",
              "next": []
            }
          ]
        }
      ]
    }
  ]
}

请给我解决方案。

1
迭代的目标是什么?您想提取什么内容?预期结果是什么? - Kinglish
@Kinglish - 我已经添加了预期结果,以获取所有的ID。 - bagya
@MikeM 是的,它也会有多个ID。 - bagya
有点不清楚 - 一个对象中是否可以有多个childnext?能否再举一个在同一对象中具有多个id的例子等。 - MikeM
@MikeM 是的,它可以有多个子节点和下一个节点。 - bagya
显示剩余6条评论
1个回答

2

let obj = {
  "F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
    "D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
      "child": {
        "87A1817D-CFA9-70FD-131B-224658AF13CE": {
          "next": {
            "F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
          }
        }
      },
      "next": {
        "B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
          "next": {}
        }
      }
    }
  }
}
const setObj = e => {
  let tmp = {}
  if (Array.isArray(e[0])) e = e[0]
  if (typeof e[0] === 'string' && e[0].split('-').length === 5) {
    tmp = {
      id: e[0],
      next: setObj(Object.entries(e[1]))
    };
  } else if (e[1]) {
    tmp = {
      child: setObj(Object.entries(e[1]))
    };
  }
  return tmp
}
let newobj = Object.entries(obj).map(setObj)[0]
console.log(newobj)

原始答案... 以下是一种解决方法。使用递归函数和 Object.entries 来收集数据。我发现结果是一系列嵌套的 id 数组 - 所以我用 join() 将它们全部展开,然后再次拆分。最后,filter() 帮助删除空数组索引。

let obj = {
  "F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
    "D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
      "child": {
        "87A1817D-CFA9-70FD-131B-224658AF13CE": {
          "next": {
            "F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
          }
        }
      },
      "next": {
        "B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
          "next": {}
        }
      }
    }
  }
}
const getKeys = e => {
  let ret = []
  if (e[0].split('-').length === 5) ret.push(e[0]);
  if (e[1]) ret.push(Object.entries(e[1]).map(getKeys))
  return ret.join(',')
}
let keys = Object.entries(obj).map(getKeys)[0].split(",").filter(e => e)
console.log(keys)


实际上,我需要嵌套级别的帮助,这样你就可以在一个短语中读取所有的ID。为了让你更清楚,我需要在每次迭代中都有ID。我需要这样做的原因是我必须使用该ID进行回调(需要嵌套级别)。 - bagya
你能直接在问题中展示期望的结果吗? - Kinglish
第一次迭代 --> F2C3C496-BEA6-A5E8-15F0-E2867304B463 第二次迭代 --> D39FD497-9529-6CC3-70DE-E8D9277C18D3 第三次迭代 --> 87A1817D-CFA9-70FD-131B-224658AF13CE 第四次迭代 --> F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A对于每次迭代,我都会回调以形成一个嵌套的JSON,其中包含各种数据。 - bagya
@bagya - 其实我已经尝试了几次,也取得了一些进展,但是数据模式的不一致让我无从下手,最终我又忙于其他事情。如果有机会,我会再试一次。 - Kinglish
我已经更新了预期结果。您能否请检查一下? - bagya
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接