我有一个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
。有人能指出我正确的方向吗?
答案 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));