从javascript中的JSON对象访问多级键

时间:2017-01-20 15:41:37

标签: javascript json node.js ejs

我有一个javascript函数,它返回这样的响应(我正在使用nodejs和ejs):

"index_1": {
    "mappings": {
        "type_1": {
            "properties": {
                "field_1": {
                    "type": "string"
                },
                "field_2": {
                    "type": "string"
                }
            }
        },
        "type_2": {
            "properties": {
                "field_1": {
                    "type": "string"
                },
                "field_2": {
                    "type": "string"
                },
                "field_3": {
                    "type": "string"
                }
            }
        }
    }
}

现在,我需要从响应中访问第二级或第三级密钥。假设我想要一个这样的列表:

type_1
type_2

field_1
field_2
field_3

我该怎么做?如果我使用callback(Object.keys(response)),则返回index_1。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

要获取子对象的键,您需要将此特定子对象传递给Object.keys()



var data = {"index_1":{"mappings":{"type_1":{"properties":{"field_1":{"type":"string"},"field_2":{"type":"string"}}},"type_2":{"properties":{"field_1":{"type":"string"},"field_2":{"type":"string"},"field_3":{"type":"string"}}}}}};

console.log(Object.keys(data.index_1.mappings));                   
    // ["type_1", "type_2"]

console.log(Object.keys(data.index_1.mappings.type_2.properties)); 
    // ["field_1", "field_2", "field_3"]




答案 1 :(得分:0)

我想,没有简单的单行。

Object.keys( object );

仅返回第一级密钥(这是您获得 index_1 的原因)。

解决方案1 ​​

如果您知道,该回复总是具有以下结构:

var jsonObject = {
   "index_1" : { 
       "mappings": {
            "type1" : ... ,
            "type2" : ...
       }
};

然后你只需要通过:

callback(Object.keys(jsonObject.index1.mappings));

这样你就可以得到第三级密钥。

但是如果你不知道结构,或者想要访问任何级别的密钥,那么递归可能会有所帮助。

var jsonObject = {
   "index_1" : {
       "mappings": {
            "type1" : { field1 : {}, field2 : 2} ,
            "type2" : {}
       }
   }
};

// 1..N, and 1 means you want to get **index_1**
function getNthLevelKeys( json, level ) {
      var keys = [];
      var currLvlKeys = Object.keys(json);
      level = level - 1;

      if ( typeof json !== 'object' || json === null) {
          return [];
      }

      if ( level > 0 ) {

           for (var i = 0; i < currLvlKeys.length; i++) {
               keys = keys.concat(getNthLevelKeys( json[ currLvlKeys[i] ] , level ));
            }
      }

      if (level === 0) {
            return currLvlKeys;
      }

      if (level < 0) {
           throw new Error("Cannot access level "+level+" of this object");
      }

      return keys;
}

console.log(getNthLevelKeys( jsonObject , 1));
console.log(getNthLevelKeys( jsonObject , 2));
console.log(getNthLevelKeys( jsonObject , 3));
console.log(getNthLevelKeys( jsonObject , 4));