Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中展平json数据结构_Javascript - Fatal编程技术网

在javascript中展平json数据结构

在javascript中展平json数据结构,javascript,Javascript,我有一个来自服务的json响应,这让我有点头疼。如何将此结构展平一点,以便将“不受限制”:{“doc\u count”:976465}更改为“不受限制”:976465?我希望有一个函数能够在所有类型的json文档中检测这种结构并修改结果 以下是json的一般结构: { "took": 159, "timed_out": false, "_shards": { "total": 6, "successful": 6, "fai

我有一个来自服务的json响应,这让我有点头疼。如何将此结构展平一点,以便将
“不受限制”:{“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旧企业中不起作用。