Javascript 在ng repeat上填充新数组

Javascript 在ng repeat上填充新数组,javascript,arrays,angularjs,Javascript,Arrays,Angularjs,$scope由控制器上的代码和金额组成的数组。计算函数的摘要时,浏览器未捕获错误:已达到10$digest()迭代次数。流产无限循环导致的错误(奇怪,但它正在工作) 当ng repeat时,有没有合适的方法组合新数组而不产生无限循环错误 任何帮助都将不胜感激 更新:行变量不是静态的,可以添加、修改或删除。 var myApp=angular.module('myApp',[]); 函数MyCtrl($scope){ $scope.Lines=[{代码:'X',金额:'10'}, {代码:'Y

$scope
由控制器上的代码和金额组成的数组。计算函数的摘要时,浏览器未捕获
错误:已达到10$digest()迭代次数。流产无限循环导致的错误(奇怪,但它正在工作)

ng repeat
时,有没有合适的方法组合新数组而不产生无限循环错误

任何帮助都将不胜感激

更新:行变量不是静态的,可以添加、修改或删除。

var myApp=angular.module('myApp',[]);
函数MyCtrl($scope){
$scope.Lines=[{代码:'X',金额:'10'},
{代码:'Y',金额:'10'},
{代码:'Z',金额:'20'},
{代码:'Y',金额:'1'}];
$scope.Sums=函数(){
var sums=新数组();
对于(变量i=0;i<$scope.Lines.length;i++){
var added=假;
对于(var j=0;j
Html:


{{line.Code}}
{{line.Amount}}
总结
{{sum.Code}
{{sum.Amount}}

如果您这样做,这种情况还会发生吗:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {

    $scope.Lines = [ {Code:'X', Amount:'10'},{Code:'Y', Amount:'10'}, 
                    {Code:'Z', Amount:'20'},{Code:'Y', Amount:'1'}];

    $scope.Sums = [];
    calculate();

    var calculate =  function(){

        $scope.Sums.length = 0;

        for (var i = 0; i < $scope.Lines.length; i++) {

              var added = false;
              for (var j = 0; j < $scope.Sums.length; j++) {

                  if ($scope.Sums[j].Code == $scope.Lines[i].Code) {
                      $scope.Sums[j].Amount = parseFloat( $scope.Sums[j].Amount) + parseFloat($scope.Lines[i].Amount);
                      added = true;
                      break;
                  }

              }

              if (!added) {
                  $scope.Sums.push( { Code:$scope.Lines[i].Code,  Amount: $scope.Lines[i].Amount  } );

              }

          }
    }
}
var myApp=angular.module('myApp',[]);
函数MyCtrl($scope){
$scope.Lines=[{Code:'X',Amount:'10'},{Code:'Y',Amount:'10'},
{代码:'Z',金额:'20'},{代码:'Y',金额:'1'}];
$scope.Sums=[];
计算();
var calculate=函数(){
$scope.Sums.length=0;
对于(变量i=0;i<$scope.Lines.length;i++){
var added=假;
对于(变量j=0;j<$scope.Sums.length;j++){
如果($scope.Sums[j]。代码==$scope.line[i]。代码){
$scope.Sums[j].Amount=parseFloat($scope.Sums[j].Amount)+parseFloat($scope.line[i].Amount);
添加=真;
打破
}
}
如果(!已添加){
$scope.Sums.push({Code:$scope.Lines[i].Code,Amount:$scope.Lines[i].Amount});
}
}
}
}
请注意,在angular监视和之后,切勿创建新数组,这一点很重要。如果需要清空,请使用
$scope.Sums.length=0


在您看来:

如果您这样做,这种情况还会发生吗:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {

    $scope.Lines = [ {Code:'X', Amount:'10'},{Code:'Y', Amount:'10'}, 
                    {Code:'Z', Amount:'20'},{Code:'Y', Amount:'1'}];

    $scope.Sums = [];
    calculate();

    var calculate =  function(){

        $scope.Sums.length = 0;

        for (var i = 0; i < $scope.Lines.length; i++) {

              var added = false;
              for (var j = 0; j < $scope.Sums.length; j++) {

                  if ($scope.Sums[j].Code == $scope.Lines[i].Code) {
                      $scope.Sums[j].Amount = parseFloat( $scope.Sums[j].Amount) + parseFloat($scope.Lines[i].Amount);
                      added = true;
                      break;
                  }

              }

              if (!added) {
                  $scope.Sums.push( { Code:$scope.Lines[i].Code,  Amount: $scope.Lines[i].Amount  } );

              }

          }
    }
}
var myApp=angular.module('myApp',[]);
函数MyCtrl($scope){
$scope.Lines=[{Code:'X',Amount:'10'},{Code:'Y',Amount:'10'},
{代码:'Z',金额:'20'},{代码:'Y',金额:'1'}];
$scope.Sums=[];
计算();
var calculate=函数(){
$scope.Sums.length=0;
对于(变量i=0;i<$scope.Lines.length;i++){
var added=假;
对于(变量j=0;j<$scope.Sums.length;j++){
如果($scope.Sums[j]。代码==$scope.line[i]。代码){
$scope.Sums[j].Amount=parseFloat($scope.Sums[j].Amount)+parseFloat($scope.line[i].Amount);
添加=真;
打破
}
}
如果(!已添加){
$scope.Sums.push({Code:$scope.Lines[i].Code,Amount:$scope.Lines[i].Amount});
}
}
}
}
请注意,在angular监视和之后,切勿创建新数组,这一点很重要。如果需要清空,请使用
$scope.Sums.length=0


在您看来:

如果我没有弄错的话

for (var j = 0; j < sums.length; j++) 
初始化数组而不是

var sums = [];

如果我没有弄错的话

for (var j = 0; j < sums.length; j++) 
初始化数组而不是

var sums = [];

我宁愿在
$scope.line
上放置一个
$watch
,它将创建一个数组并将其填充为
$scope.sums
,这样ng repeat就不必反复调用该方法。看

编辑(添加缺少的参数以进行深度监视):


我宁愿在
$scope.line
上放置一个
$watch
,它将创建一个数组并将其填充为
$scope.sums
,这样ng repeat就不必反复调用该方法。看

编辑(添加缺少的参数以进行深度监视):

正如前面指出的,问题是因为您的
sum()
正在返回一个对象

我建议使用过滤器来完成你需要的东西,就像这样

HTML

<div ng-controller="MyCtrl">
    <table style="border:  1px solid black;">
      <tr ng-repeat="line in Lines">
           <td>{{ line.Code }}</td>
           <td>{{ line.Amount }}</td>
      </tr>
     </table>
    Summary 
      <table style="border:  1px solid black;">
      <tr ng-repeat="sum in Lines | unique : 'Code'">
           <td>{{ sum.Code }}</td>
           <td>{{ Lines | filter: { Code: sum.Code } : true | sum: 'Amount' }}</td>
      </tr>
     </table>
</div>

{{line.Code}}
{{line.Amount}}
总结
{{sum.Code}
{Lines | filter:{Code:sum.Code}:true | sum:'Amount'}
脚本

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.Lines = [ {Code:'X', Amount:'10'},{Code:'Y', Amount:'10'}, 
                    {Code:'Z', Amount:'20'},{Code:'Y', Amount:'1'}];
}


myApp.filter('unique', function() {
    return function(input, key) {
        var unique = {};
        var uniqueList = [];
        for(var i = 0; i < input.length; i++){
            if(typeof unique[input[i][key]] == "undefined"){
                unique[input[i][key]] = "";
                uniqueList.push(input[i]);
            }
        }
        return uniqueList;
    };
});

myApp.filter('sum', function() {
    return function(input, key) {
        var sum = 0;
        for(var i = 0; i < input.length; i++){
            sum += Number(input[i][key]);
        }
        return sum;
    };
});
var myApp=angular.module('myApp',[]);
函数MyCtrl($scope){
$scope.Lines=[{Code:'X',Amount:'10'},{Code:'Y',Amount:'10'},
{代码:'Z',金额:'20'},{代码:'Y',金额:'1'}];
}
myApp.filter('unique',function(){
返回功能(输入,按键){
var unique={};
var uniqueList=[];
对于(变量i=0;i