【问题标题】:Making calculations from nested arrays in AngularJS从 AngularJS 中的嵌套数组进行计算
【发布时间】:2017-02-21 15:03:42
【问题描述】:

我有以下数组:

$scope.products = [
  {
    nom : "Pa de fajol",
    img : "dill1.jpg",
    descripcio: [
      "Pa de motlle"
    ],
    preu:4.90,
    tipus: "Pa"
  },
  {
    nom : "Pagès semi integral de blat/espelta",
    img : "dill2.jpg",
    descripcio: [
      "Pa de pagès",
      "680g / 400g"
    ],
    tipus: "Pa",
    variacions : [
      {
        nom: "Gran",
        preu: "3.70",
        grams: "680g",
        basket: 0
      },
      {
        nom: "Petit",
        preu: "2.30",
        grams: "400g",
        basket: 1
      }
    ]
  }

在前端,我用ng-repeat 显示它,并且根据产品是否有价格(preu),我为单个产品显示一个数量输入,或每个变体一个输入。

看起来像这样:

<div ng-repeat="pa in products">
  <div ng-if="!pa.preu" ng-repeat="vari in pa.variacions">
    <input type="number" ng-model="pa.variacions.basket" ng-init="pa.variacions.basket=0">
  </div>
  <input ng-if="pa.preu" type="number" ng-model="pa.basket" name="basket" ng-init="pa.basket=0">
</div>
<a ng-click="insert()">Add to cart</a>

当我触发insert() 时,我有一个函数可以添加产品并计算总价,但到目前为止它只适用于有价格的产品,不适用于变体。

函数如下所示:

$scope.insert = function() {
  $scope.singleorder = [];

  for(var i = 0; i < $scope.products.length; i++)
    if($scope.products[i].basket) { // if input has been setted
      $scope.singleorder.push({
        'product': $scope.products[i].nom,
        'number': $scope.products[i].basket,
        'preu': ($scope.products[i].preu * $scope.products[i].basket)
      });
    }
  console.log($scope.singleorder);
}

我将如何继续在 $scope.singleorder 数组中包含来自嵌套变量数组的计算?

有什么建议吗?

编辑

请参阅Plunkr 重现该问题

解决方案

在一些 cmets 的帮助下,我设法修复了它!

查看 Plunkr 了解最终版本。 这是最终的功能:

$scope.insert = function() {
  $scope.singleorder = [];
  for(var i = 0; i < $scope.products.length; i++)
    if($scope.products[i].basket) { // if input has been setted
      $scope.singleorder.push({
        'product': $scope.products[i].nom,
        'number': $scope.products[i].basket,
        'preu': ($scope.products[i].preu * $scope.products[i].basket)
      });
    }
    else if($scope.products[i].variacions) { // if input has been setted
      angular.forEach($scope.products[i].variacions, function(variacions) {
        if(variacions.basket) {
          $scope.variname =  $scope.products[i].nom + ' (' + variacions.nom + ')'  
          $scope.singleorder.push({
            'product': $scope.variname,
            'number': variacions.basket,
            'preu': (variacions.preu * variacions.basket)
          });
        }
      });
    }

  console.log($scope.singleorder);

【问题讨论】:

  • 你能在 plnkr/jsfiddle/jsbin 中重现这个吗?
  • 你的插入函数在哪里处理变化?
  • @CallumLinington 查看编辑
  • @putonspectacles 就是这样,我不知道如何访问它们,进行计算并将它们包含在最终数组中(单序)
  • 嗯,你知道如何使用点语法,那么$scope.products[i].variacions 中的内容是什么?应该是数组。所以就像你对 $scope.products 所做的那样循环。

标签: javascript angularjs arrays


【解决方案1】:

你的问题是你的 variacions 是一个数组使用这个,

$scope.insert = function() {
      $scope.singleorder = [];
      for(var i = 0; i < $scope.products.length; i++)
        if($scope.products[i].basket) { // if input has been setted
          $scope.singleorder.push({
            'product': $scope.products[i].nom,
            'number': $scope.products[i].basket,
            'preu': ($scope.products[i].preu * $scope.products[i].basket)
          });
        }
        else if($scope.products[i].variacions) { // if input has been setted
          for(var j=0;j<$scope.products[i].variacions.length; j++){
            $scope.singleorder.push({
            'product': $scope.products[i].variacions[j].nom,
            'number': $scope.products[i].variacions[j].basket,
            'preu': ($scope.products[i].variacions[j].preu * $scope.products[i].variacions[j].basket)
          });
          }
        }

      console.log($scope.singleorder);

    }

Plunkr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多