嵌套json中的angular create table

时间:2016-02-24 13:53:07

标签: angularjs

我正在尝试使用弹性搜索响应中的嵌套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,但是我不知道该怎么做。

有谁知道如何才能让它发挥作用?

谢谢!

2 个答案:

答案 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}}