首页 > 解决方案 > 使用递归,检索嵌套对象结构的对象名称返回未定义

问题描述

我正在尝试检索嵌套对象树/结构中的所有对象名称。

var testObj = {
      "name": "testObj",
      "version": "0.1.1",
      "dependencies": {
        "nameLvl1-1": {
          "version": "0.3.7",
          "dependencies": {
            "nameLvl2": {
              "version": "0.0.2"
            }
          }
        },
        "nameLvl1-2": {
          "version": "1.2.6"
        }
      }
    }

目前我正在使用递归遍历结构,但是当我尝试“捕获”嵌套结构中的对象名称时,它返回“未定义”

这是我目前拥有的:

const versionKeys2 = (obj) => {
  const result = []
  Object.keys(obj).forEach(x => {
    const key = x;
    const value = obj[x];
    if (key === 'version') {
      console.log(`${key} as key, ${obj[key]} as value, ${obj.name} as obj`)
      result.push(`${obj.name}@${obj[key]}`)
    }
    if (typeof value === 'object') {
      result.push(versionKeys2(value))
    }
  })
  return result
}

作为记录到控制台的示例:

version as key, 0.3.7 as value, undefined as obj

对于第一级,它返回名称,但在该级别之后,“${obj.name}”返回未定义的嵌套对象。任何人都知道解决第一级以外的对象名称吗?

编辑:基于模板文字字符串的预期结果看起来像这样——[["dependencies"@"0.3.7"],["nameLvl1-1"@"0.3.7"],["nameLvl2"@"0.0.2"],["nameLvl1-2"@"1.2.6"]]

标签: javascriptobjectrecursionnested

解决方案


您可以获取嵌套名称并检查实际对象是否包含name属性。

const
    getNames = (object, name) => [
        `${object.name || name}@${object.version}`,
        ...Object
            .entries(object.dependencies || {})
            .flatMap(([k, v]) => getNames(v, k))
    ],
    testObj = { name: "testObj", version: "0.1.1", dependencies: { "nameLvl1-1": { version: "0.3.7", dependencies: { nameLvl2: { version: "0.0.2" } } }, "nameLvl1-2": { version: "1.2.6" } } },
    names = getNames(testObj);

console.log(names);


推荐阅读