在 Javascript 中获取深层对象的所有键

新手上路,请多包涵

我有以下对象:

 var abc = {
    1: "Raggruppamento a 1",
    2: "Raggruppamento a 2",
    3: "Raggruppamento a 3",
    4: "Raggruppamento a 4",
    count: '3',
    counter: {
        count: '3',
    },
    5: {
        test: "Raggruppamento a 1",

        tester: {
            name: "Georgi"
        }
    }
};

我想检索以下结果:

  • 美国广播公司[1]
  • 美国广播公司[2]
  • 美国广播公司[3]
  • 美国广播公司[4]
  • abc.计数
  • abc.counter.计数
  • 美国广播公司[5]
  • abc[5].测试
  • abc[5].测试仪
  • abc[5].tester.name

是否有可能在插件的帮助下使用 nodejs?

原文由 Georgi Kirilov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 541
2 个回答

您可以通过递归遍历对象来做到这一点:

 function getDeepKeys(obj) {
    var keys = [];
    for(var key in obj) {
        keys.push(key);
        if(typeof obj[key] === "object") {
            var subkeys = getDeepKeys(obj[key]);
            keys = keys.concat(subkeys.map(function(subkey) {
                return key + "." + subkey;
            }));
        }
    }
    return keys;
}

在问题中的对象上运行 getDeepKeys(abc) 将返回以下数组:

 ["1", "2", "3", "4", "5", "5.test", "5.tester", "5.tester.name", "count", "counter", "counter.count"]

原文由 Peter Olson 发布,翻译遵循 CC BY-SA 3.0 许可协议

较小的版本,没有副作用,函数体中只有 1 行:

 function objectDeepKeys(obj){
  return Object.keys(obj).filter(key => obj[key] instanceof Object).map(key => objectDeepKeys(obj[key]).map(k => `${key}.${k}`)).reduce((x, y) => x.concat(y), Object.keys(obj))
}

 var abc = {
    1: "Raggruppamento a 1",
    2: "Raggruppamento a 2",
    3: "Raggruppamento a 3",
    4: "Raggruppamento a 4",
    count: '3',
    counter: {
        count: '3',
    },
    5: {
        test: "Raggruppamento a 1",

        tester: {
            name: "Ross"
        }
    }
};

function objectDeepKeys(obj){
  return Object.keys(obj)
    .filter(key => obj[key] instanceof Object)
    .map(key => objectDeepKeys(obj[key]).map(k => `${key}.${k}`))
    .reduce((x, y) => x.concat(y), Object.keys(obj))
}

console.log(objectDeepKeys(abc))

原文由 ronald8192 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题