【问题标题】:Access multilevel key from a JSON object in javascript从 javascript 中的 JSON 对象访问多级键
【发布时间】:2017-06-05 15:54:16
【问题描述】:

我有一个 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。谁能指出我正确的方向?

【问题讨论】:

  • 您是否需要特定的字段或类型,或者您想为每个字段或类型执行某些操作?

标签: javascript json node.js ejs


【解决方案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"]

【讨论】:

    【解决方案2】:

    我想没有简单的单线。

    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));
    

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多