在javascript中展平json数据结构
我有一个来自服务的json响应,这让我有点头疼。如何将此结构展平一点,以便将在javascript中展平json数据结构,javascript,Javascript,我有一个来自服务的json响应,这让我有点头疼。如何将此结构展平一点,以便将“不受限制”:{“doc\u count”:976465}更改为“不受限制”:976465?我希望有一个函数能够在所有类型的json文档中检测这种结构并修改结果 以下是json的一般结构: { "took": 159, "timed_out": false, "_shards": { "total": 6, "successful": 6, "fai
“不受限制”:{“doc\u count”:976465}
更改为“不受限制”:976465
?我希望有一个函数能够在所有类型的json文档中检测这种结构并修改结果
以下是json的一般结构:
{
"took": 159,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"failed": 0
},
"hits": {
"total": 4909332,
"max_score": 1,
"hits": [
{
...
},
{
...
},
{
...
}
]
},
"aggregations": {
"index_types": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "client",
"doc_count": 1958205,
"not_restricted": {
"doc_count": 976465
},
"restricted": {
"doc_count": 981740
}
},
{
"key": "ultimateparent",
"doc_count": 1616164,
"not_restricted": {
"doc_count": 741059
},
"restricted": {
"doc_count": 875105
}
},
{
"key": "facility",
"doc_count": 1334963,
"not_restricted": {
"doc_count": 914090
},
"restricted": {
"doc_count": 420872
}
}
]
}
}
}
如果要遍历对象并展平所有1属性对象,可以执行以下操作:
for (var i = 0; i < data.aggregations["index_types"].buckets.length; i++) {
var obj = data.aggregations["index_types"].buckets[i];
for (var key in obj) {
if (typeof obj[key] === "object" && Object.keys(obj[key]).length === 1) {
//1 property object!
obj[key] = obj[key][Object.keys(obj[key])[0]];
}
}
}
for(var i=0;i
演示:因为您说过JSON实际上是字符串,如果您只需要特定的替换:
Replacing `{"doc_count": NUMBER}` with that `NUMBER`
您所能做的只是使用正则表达式替换您想要的:
s.replace(/({"doc_count":([0-9]+)})/g, '$2')
其工作原理如下:
( // start capturing group 1
{\"doc_count\": // match the string {\"doc_count\":
( // start capturing group 2
[0-9]+ // match one or more digits
) // close capturing group 2
} // add the rest of the string (a closing bracket)
然后,您可以在replace()
中使用$2
仅从2中提取数字
var json={
“聚合”:{
“索引类型”:{
“单据计数错误上限”:0,
“合计其他单据数”:0,
“桶”:[{
“密钥”:“客户端”,
“doc_count”:1958205,
“不受限制”:{
“单据计数”:976465
},
“限制”:{
“文件计数”:981740
}
}, {
“密钥”:“最终父级”,
“文件计数”:1616164,
“不受限制”:{
“文件计数”:741059
},
“限制”:{
“文件计数”:875105
}
}, {
“钥匙”:“设施”,
“doc_count”:1334963,
“不受限制”:{
“单据计数”:914090
},
“限制”:{
“单据计数”:420872
}
}]
}
}
};
var s=JSON.stringify(JSON);
//用该数字替换{doc_count:NUMBER}的所有实例
log(s.replace(/({“doc_count”:([0-9]+)})/g,$2')代码>通过使用,您可以非常轻松地做到这一点,它允许您过滤JSON中的每个对象:
var res = JSON.parse(json, function(k, o) {
if (Object(o) !== o) return o; // primitive values
var keys = Object.keys(o);
if (keys.length == 1 && keys[0] == "doc_count")
return o.doc_count;
else
return o;
});
如果您想确保仅在此类属性中替换doc\u count
单例,还可以测试k
以包括“受限”
或其他内容。您可以使用它来简化您的生活。包括它,然后您可以使用0
_.each(data.aggregations.index_types.buckets, function(n){
n.not_restricted = n.not_restricted.doc_count;
n.restricted = n.restricted.doc_count;
})
你有实际的JSON还是已经有了一个对象?不,它实际上是JSON。它的json响应来自service@HorseVoice您可能想要签出,它实际上是一个json字符串。不是真正的目标。它会以同样的方式工作吗?对不起,我是新来的javascript@HorseVoice--使用JSON.parse(str)
将其转换为一个对象-如果它只是一个字符串,则不会有相同的效果。然后,我必须将其转换回字符串进行处理。为此,我可以直接使用String(jsonDoc)对吗?@horsesvoice--JSON.stringify(obj)
这只返回修改过的对象,而忘记了JSON的其余部分。这对我不起作用。我需要把整个文档放回去,在受限和非受限编辑中包含扁平化的doc_count垃圾。基本上,您可以捕获匹配的部分(或组)。@horsesvoice我添加了更多的解释,希望helpsYea,所有其他结构都必须相同。只有限制和非限制。在文档和列表等中还有其他字段,其中包含嵌套的文档计数,我一点也不想搞砸。这是非常具体的。我怎么用这个(“(?:not_)?restricted:{“doc_count”:([0-9]+)})
与使用其他正则表达式的方式相同。我相应地编辑了我的答案。好吧,这没有任何作用。答复没有修改。我仍然可以在restricted和not_restrictedBergi中看到doc_count-我不确定这是什么,因为我是javascript新手,但是这会修改现有的doc吗?假设json
参数是响应文档。它只是修改它吗?或者这只是返回它的aggs部分?不,它返回json
字符串的解析版本(对象),其中每个{“doc\u count”:…}
对象仅替换为..
。顺便说一句,你不能在JS中“修改”字符串,它们是不可变的。如果需要取回JSON,可以使用JSON.stringify(res,null,4)
;如果需要,可以用它覆盖json
变量。那么它会返回整个文档吗?只需稍微修改doc_count?是的,它返回一个完整JSON的对象,而不包含doc_count对象。只需在控制台中尝试并检查结果:-)如何将其作为预定义方法?我使用的是extjs框架,它不理解这种功能性的方法。我怎样才能定义一个特定的方法来实现这一点,然后在代码中需要的地方调用它,通过传入响应,这个方法返回响应?此外,我认为JSON.parse在我的IE8旧企业中不起作用。