2014-09-12 126 views
0

嗯,我必須要能概括這個JSON JSONLINK的coursePrice上AngularJS(JavaScript)的Sum函數

我得把兩個總和,一個學校和其他所有學校。我已經打印上表中的所有數據,但林不知道如何作出這樣的JavaScript函數

+0

是'coursePrice'真的格式化一個美元符號? – ryeballar 2014-09-12 13:50:08

+0

是的它是:S im confuse – 2014-09-12 13:51:55

+1

如果你有控制你的後端改變它爲一個無格式數字(沒有美元符號和逗號),那麼它更容易總結起來 – ryeballar 2014-09-12 13:52:34

回答

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> 
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; 
}); 
+0

我認爲這樣的事情@Teo unaControllers.contorller(「sumCoursePrice」,['$ scope','UNAService', function($ scope,UNAService ){ VAR總和= 0; UNAService.getAllSchools(功能(錯誤,數據){ 如果(錯誤!){ 總和+ = data.professors.coursePrice; } 返回總和; }); }] ); 但我不知道我是否可以做到這一點 – 2014-09-12 14:05:48

+0

好吧,這是一個開始,但首先你需要將data.professors.coursePrice的值變成一個浮點數,我可以幫助你使用jQuery開始處理這個問題,但是你沒有如果您正在使用它,則不會在問題中指定。 – Teo 2014-09-12 14:08:00

+0

AngularJS is javascript – 2014-09-12 14:09:44