【问题标题】:How can I get keys from nested object?如何从嵌套对象中获取密钥?
【发布时间】:2022-01-13 11:14:50
【问题描述】:

我有一个带有嵌套对象的 javascript 对象:

{
    "common": {
      "setting1": "Value 1",
      "setting2": 200,
      "setting3": true,
      "setting6": {
        "key": "value",
        "doge": {
          "wow": ""
        }
      }
    },
    "group1": {
      "baz": "bas",
      "foo": "bar",
      "nest": {
        "key": "value"
      }
    },
    "group2": {
      "abc": 12345,
      "deep": {
        "id": 45
      }
    }
  }

我必须将所有键作为嵌套数组。

我试过这个功能:

function getKeys(obj) {                                                                                                                                
  return Object.keys(obj).map((key, keys) => {                                                                                                      
    if (typeof obj[key] !== 'object') return key;                                                                                                    
    return [key, getKeys(obj[key])];                                                                                               
  });                                                                                                                                                  
}    

 

得到了这个://

[
  [ 'common', [ 'setting1', 'setting2', 'setting3', [Array] ] ],
  [ 'group1', [ 'baz', 'foo', [Array] ] ],
  [ 'group2', [ 'abc', [Array] ] ]
]

而不是像这样的预期结果:

    [
  [ 'common', [ 'setting1', 'setting2', 'setting3','setting6', ['key','doge', ['wow']],
  [ 'group1', [ 'baz', 'foo', ['nest', ['key'] ],
  [ 'group2', [ 'abc', 'deep', ['id'] ] ]
    ]

等等

请帮帮我

【问题讨论】:

  • 输出看起来正确吗?从你的角度来看它有什么问题?你在节点上运行这个吗?
  • 尝试使用JSON.stringify(output) 再次控制台记录结果。 nodejs 提示可能不会显示对象的所有详细信息。
  • @evolutionxbox 是的,它看起来正确,但不考虑多个嵌套对象。它必须是 [array] - 另一个嵌套键。是的,它是节点
  • 为什么key 会在一个单独的数组中然后doge
  • @Nenad Vracar 我的错

标签: javascript arrays object nested


【解决方案1】:

您可以在Object.entries 上使用reduce 并创建一个递归函数。

const data = {"common":{"setting1":"Value 1","setting2":200,"setting3":true,"setting6":{"key":"value","doge":{"wow":""}}},"group1":{"baz":"bas","foo":"bar","nest":{"key":"value"}},"group2":{"abc":12345,"deep":{"id":45}}}

function getKeys(data) {
  return Object.entries(data).reduce((r, [key, value]) => {
    r.push(key)
    if (typeof value === 'object') r.push(getKeys(value))
    return r
  }, [])
}

console.log(getKeys(data))

【讨论】:

  • 谢谢,它有效,但它不考虑另一个布局“哇”它看起来像:['common',['setting1','setting2','setting3','setting6 ',['key','doge',[Array]]],'group1',['baz','foo','nest',['key']],'group2',['abc', '深',['id']]]
  • 我不确定你想说什么。
【解决方案2】:

试试这个

function getKeys (obj) {
    const keys = Object.keys(obj);
    for (let i = 0; i < keys.length; i++){
        const key = keys[i];
        if (typeof obj[key] === 'object') {
            keys.splice(i+1, 0, getKeys(obj[key]));
            i++;
        }
    }
    return keys
}

结果:

'["common",["setting1","setting2","setting3","setting6",["key","doge",["wow"]]],"group1",["baz","foo","nest",["key"]],"group2",["abc","deep",["id"]]]'

可能不是最优化的解决方案,但应该可以工作。

【讨论】:

  • 谢谢,它有效,但它不考虑另一个布局“哇”它看起来像:['common',['setting1','setting2','setting3','setting6 ',['key','doge',[Array]]],'group1',['baz','foo','nest',['key']],'group2',['abc', '深',['id']]]
  • 我运行了代码并包含了结果。这就是你想要的结果,对吧?
  • 你应该使用JSON.stringify(getKeys(obj));查看结果
【解决方案3】:

谢谢,这两个选项都有效!我只需要在if (typeof obj[key] === 'object') 中添加空检查,因为 TypeError: Cannot convert undefined or null to object 常量键 = Object.keys(obj); (其中一个值为 null 并且“Typeof null 返回 'object' ,这是 JavaScript 中可能永远无法修复的历史错误。”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多