我正在尝试使用弹性搜索响应中的嵌套json创建表。
json看起来像这样:
{
"took": 18,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 94,
"max_score": 0.0,
"hits": [
]
},
"aggregations": {
"byDateTime": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1232037318222,
"key_as_string": "2012/01/12 16:34:18.000",
"doc_count": 2,
"byRecordNum": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 4876,
"doc_count": 2,
"byhash": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "632854032d8e042ec124dbfad12e214a",
"doc_count": 2,
"byContent": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "useraction",
"doc_count": 2,
"tophits": {
"hits": {
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "myIndex",
"_type": "log",
"_id": "AVMN9FCKyxgCcpqsf1n3",
"_score": 1.0,
"_source": {
"Field1": "Value1",
"Field2": "Value2",
"Field3": "Value3"
}
我需要为表访问的值包含在最后的hits.hits部分中。
在控制器中我指定:
$scope.selectedactionhits = response.aggregations.byDateTime.buckets;
然后我可以使用以下内容访问我需要的元素:
div ng-repeat="item in selectedactionhits">
<div ng-repeat="a in item.byRecordNum.buckets">
<div ng-repeat="b in a.byhash.buckets">
<div ng-repeat="c in b.byContent.buckets">
<div ng-repeat="d in c.tophits.hits.hits">
{{d._source.Field1}}
{{d._source.Field2}}
{{d._source.Field3}}
我需要做的是使用这些字段的值创建一个表,但是因为它们嵌套在ng-repeat中,所以表格格式不起作用。
我考虑过在控制器中做些什么来整理json,但是我不知道该怎么做。
有谁知道如何才能让它发挥作用?
谢谢!
答案 0 :(得分:2)
在对JSON进行一些清理之后,我发现了我认为最简单的solution。使用JSON.stringify并将函数传递给第二个参数,该参数将保存数组中的命中。
function retrievehits (key, v) {
if (key === 'hits' && v) {
var isArray = Array.isArray(v);
if (!isArray) {
hits.push(JSON.stringify(Object.assign({}, v, {hits: undefined})));
}
else if (isArray) {
for (var i = 0; i < v.length; i++) {
retrievehits('hits', v[i]);
}
return;
}
}
return v;
}
答案 1 :(得分:0)
感谢您的所有回复。我找到了一个似乎有效的解决方案。
在控制器中我有:
var flat = [];
angular.forEach($scope.selectedactionhits, function(item){
//second level
angular.forEach(item.byRecordNum.buckets, function(item2){
//Third level
angular.forEach(item2.byhash.buckets, function(item3){
//Fourth level
angular.forEach(item3.byContent.buckets, function(item4){
//fith level
angular.forEach(item4.tophits.hits.hits, function(item5){
flat.push(item5);
})
})
})
})
})
$scope.flatarray = flat;
我现在可以使用:
ng-repeat item in flatarray
然后将每个元素作为:
{{item._source.Field1}}