使用嵌套json对象进行角度ng重复?

Ste*_*eve 10 json angularjs angularjs-ng-repeat

我有一个JSON对象,表示如下:

 {
  "orders" : [
    {
      "ordernum" : "PRAAA000000177800601",
      "buyer" : "Donna Heywood"
      "parcels" : [
        {
          "upid" : "UPID567890123456",
          "tpid" : "TPID789456789485"
        },
        {
          "upid" : "UPID586905486090",
          "tpid" : "TPID343454645455"          
        }
      ]
    },
    {
      "ordernum" : "ORAAA000000367567345",
      "buyer" : "Melanie Daniels"
      "parcels" : [
        {
          "upid" : "UPID456547347776",
          "tpid" : "TPID645896579688"
        },
        {
          "upid" : "UPID768577673366",
          "tpid" : "TPID784574333345"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要在第二级做一个转发器,一个"upid"号码列表.

我知道如何获得最高级别

<li ng-repeat="o in orders">{{o.ordernum}}</li>

但我不清楚顺序循环一个级别.例如,这是错误的:

<li ng-repeat="p in orders.parcels">{{p.upid}}</li>

我也知道如何嵌套转发器以获得这个,但在这种情况下我根本不需要显示顶层.

澄清

这里的目标是有一个列表,其中包含4个"upid"数字(每个包裹有2个,订单中有2个包裹).

syl*_*ter 5

您可以像下面的演示一样创建新阵列'parcels':

var app = angular.module('app', []);
app.controller('homeCtrl', function($scope) {
  $scope.data = {
    "orders": [{
      "ordernum": "PRAAA000000177800601",
      "buyer": "Donna Heywood",
      "parcels": [{
        "upid": "UPID567890123456",
        "tpid": "TPID789456789485"
      }, {
        "upid": "UPID586905486090",
        "tpid": "TPID343454645455"
      }]
    }, {
      "ordernum": "ORAAA000000367567345",
      "buyer": "Melanie Daniels",
      "parcels": [{
        "upid": "UPID456547347776",
        "tpid": "TPID645896579688"
      }, {
        "upid": "UPID768577673366",
        "tpid": "TPID784574333345"
      }]
    }]
  };

  $scope.parcels = [];
  angular.forEach($scope.data.orders, function(order) {
    angular.forEach(order.parcels, function(parcel) {
      $scope.parcels.push(parcel)
    })
  })
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="homeCtrl">

    <ul>
      <li ng-repeat="o in parcels">{{o.upid}}</li>
    </ul>

  </div>
</div>
Run Code Online (Sandbox Code Playgroud)


Pan*_*kar 5

实际上它与@sylwester的答案相同.把它放进去的更好方法filter.您可以通过传递propertyName参数来重用它.

在你的情况下,我们通过 parcels

JS

myApp.filter('createarray', function () {
    return function (value, propertyName) {
        var arrayList = [];
        angular.forEach(value, function (val) {
            angular.forEach(val[propertyName], function (v) {
                arrayList.push(v)
            });
        });
        return arrayList;
    }
});
Run Code Online (Sandbox Code Playgroud)

HTML

<ul>
    <li ng-repeat="o in ordersList.orders | createarray: 'parcels'">{{o.upid}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

这是工作小提琴


che*_*huk 2

大量搜索用于动态迭代的漂亮且简单的解决方案。我想出了这个

JAVASCRIPT(角度):人是嵌套对象的一个​​例子。is_object 函数将在 HTML 视图中使用。

$scope.person = {
    "name": "john",
    "properties": {
       "age": 25,
       "sex": "m"
    },
    "salary": 1000
}

// helper method to check if a field is a nested object
$scope.is_object = function (something) {
    return typeof (something) == 'object' ? true : false;
};
Run Code Online (Sandbox Code Playgroud)

HTML:定义简单表格的模板。第一个 TD 是显示的密钥。如果不是对象(数字/字符串),另一个 TD(2 或 3,但绝不会同时显示两者)将显示该值,或者如果它是对象,则再次循环。

<table border="1">
<tr ng-repeat="(k,v) in person">
    <td> {{ k }} </td>
    <td ng-if="is_object(v) == false"> {{ v }} </td>
    <td ng-if="is_object(v)">
        <table border="1">
            <tr ng-repeat="(k2,v2) in v">
                <td> {{ k2 }} </td>
                <td> {{ v2 }} </td>
            </tr>
        </table>
    </td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)