双数组中的求和函数

时间:2014-09-12 13:48:03

标签: javascript html5 angularjs

我必须能够在AngularJS(javascript)上总结这个JSON JSONLINK的课程价格

我必须两笔钱,一个用于学校,另一个用于所有学校。我已经在桌面上打印了所有数据,但我不确定如何制作javascript函数

2 个答案:

答案 0 :(得分:1)

我认为这会让你开始

// get numeric value and separate it by ','
var num = coursePrice.split('$')[1].split(","); 
// concatenate numeric string
num = num[0] + num[1]; 
// turn it into a float
num = parseFloat(num);

下次不要指望别人做你的工作:

var sum = 0;

data.forEach(function(d) {
   d.professor.forEach(function(p) {
      var num = p.coursePrice.split('$')[1].split(","); 
      // concatenate numeric string
      num = num[0] + num[1]; 
      // turn it into a float
      num = parseFloat(num);
      allSum += num;
   });
});

这将适用于所有学校,对于个别学校,您可以使用jQuery $ .grep函数完成此任务。

对于没有$ .grep和jQuery的个别学校:

var schools = [];
var schoolsSum = [];

data.forEach(function(d) {
   if(schools.indexOf(d.school) == -1) {
      schools.push(d.school);
      schoolsSum.push(0);
   }
   var schoolIndex = schools.indexOf(d.school);
   d.professor.forEach(function(p) {
      var num = p.coursePrice.split('$')[1].split(","); 
      // concatenate numeric string
      num = num[0] + num[1]; 
      // turn it into a float
      num = parseFloat(num);
      allSum += num;
      schoolsSum[schoolIndex] += num;
   });
});

在此之后你应该有两个数组,其中一个包含学校名称,一个是schols课程价格总和。您可以轻松地创建这两个对象:

var schoolsObj = new Object();
var index = 0;
schools.forEach(function(s) {
   schoolsObj[s] =  schoolsSum[index];
   index += 1;
});

答案 1 :(得分:0)

此处要解决的第一个问题是将coursePrice解析为数字,为此您可以使用String.prototype.replace()然后将其更改为数字。

<强> DEMO

类似的东西:

+coursePrice.replace(/[^0-9\.]+/g,"");

其中+符号将替换后的字符串更改为数字。

现在让我们回到您要创建的两个函数,首先让我们创建一个具有函数getSchoolCoursePrice()getTotalSchoolCoursePrice()的服务。

服务

  .service('SchoolService', function() {

    this.getSchoolCoursePrice = function(school) {
      return school.professor.reduce(function(value, professor) {
        return value + +professor.coursePrice.replace(/[^0-9\.]+/g,"");
      }, 0.00);
    };

    this.getTotalSchoolCoursePrice = function(schools) {
      return schools.reduce(function(value, school) {
        return value + school.totalCoursePrice;
      }, 0.00);
    };

  })

SchoolService.getSchoolCoursePrice()获取学校的总课程价格,因为您已注意到该函数接受了一个学校的参数。

另一方面,

SchoolService.getTotalSchoolCoursePrice()接受一系列学校的参数,这些参数获得每所学校的totalCoursePrice。在迭代每所学校时分配此totalCoursePrice,然后使用SchoolService.getSchoolCoursePrice()为其分配此属性。

控制器

.controller('SchoolController', function($scope, $http, SchoolService) {

    $http.get('schools.json').success(function(schools) {

      $scope.schools = schools.map(function(school) {
        school.totalCoursePrice = SchoolService.getSchoolCoursePrice(school);
        return school;
      });

      $scope.totalPrice = SchoolService.getTotalSchoolCoursePrice(schools);

    });

  });

您可以看到控制器,获取学校列表,然后在每所学校附加totalCoursePrice财产。

HTML

<table>
  <tr>
    <td>School</td>
    <td>Total Course Price</td>
  </tr>
  <tr ng-show="!schools">
    <td colspan="2">Loading...</td>
  </tr>
  <tr ng-repeat="school in schools track by $index">
    <td ng-bind="school.school"></td>
    <td ng-bind="school.totalCoursePrice"></td>
  </tr>
  <tr ng-show="schools">
    <td>Total Price</td>
    <td ng-bind="totalPrice"></td>
  </tr>
</table>