基于另一个json文件从json文件角度读取数据

时间:2016-02-03 18:05:55

标签: javascript angularjs json ng-repeat

我是角色新手,遇到了一个我不知道设置此代码的最佳方法的场景。

我有2个JSON文件:

images.json

{
    "imageName":        "example.jpg",
    "imageTags":        ["fun","work","utility"]
    "productID":        ["item1","item3"]
}

products.json

{
    "productID":        "item1",
    "productName":      "Staple Gun",
    "productURL":       "Staple-Gun.htm"
}

我还没有任何代码,我真的想确保首先正确构建此代码。

我的目标是根据标签提取图像,因此我在第一个ng-repeat部分放置了一个过滤器。这部分效果很好。但我希望能够链接到图像中的产品。我发现的最简单的事情是使用productID作为过滤器进行ng-repeat,但如果我要拍50张照片并且每张照片有2个项目,那就是大量的重复。在我看来,这需要大量的资源。这是最好的方式还是有更好的方法来处理这个问题?

代码示例:

<div ng-repeat="photo in photos | filter: 'fun'">
   <img ng-src="{{ photo.imageName }}">
   <span>Products In This Image</span>
   <div ng-repeat="product in products | filter: photo.productID">
       <a ng-href="{{ product.productURL }}" title="{{ product.productName }}">{{ product.productName }}</a>
   </div>
</div>

1 个答案:

答案 0 :(得分:1)

将产品简单映射到使用productID作为键的对象会更有效率

$scope.product_map = {};
products.forEach(function(item) {
  $scope.product_map[item.productID] = item
});

将产生:

{
  "item1": {
    "productID": "item1",
    "productName": "Staple Gun",
    "productURL": "Staple-Gun.htm"
  }
}

这意味着您无需在每次需要查找产品时过滤整个数组,而只需执行以下操作:

var productNeeded = $scope.product_map['item1'];

在视图中,这将转换为:

<div ng-repeat="photo in photos | filter: 'fun'">
   <img ng-src="{{ photo.imageName }}">
   <span>Products In This Image</span>
    <!-- iterate small array of productID's in photo object -->
   <div ng-repeat="id in photo.productID">
       <!-- product_map[id] is a single object reference -->
       <a ng-href="{{ product_map[id].productURL }}" title="{{ product_map[id].productName }}">{{ product_map[id].productName }}</a>
   </div>
</div>