2015-10-27 3 views
1

У меня есть объект json, который будет содержать пары ключ-значение для клиентов, например, клиенты будут меняться в зависимости от дня, в зависимости от того, какие из них совершили определенную транзакцию в указанный день месяца. Поэтому мои данные будут содержать транзакции, совершаемые клиентами. Вот пример моего объекта данных в первый день месяцаПодсчет отдельных пар ключ/значение в динамическом объекте json

$scope.dailybreakdown = [ 
     {'day': '1', 'client':'client1', 'received': '3', 'approved':'0'}, 
     {'day': '1', 'client':'client2', 'received': '8', 'approved':'1'}, 
     {'day': '1', 'client':'client3', 'received': '4', 'approved':'0'}, 
     {'day': '1', 'client':'client4', 'received': '4', 'approved':'0'}, 
     {'day': '2', 'client':'client1', 'received': '3', 'approved':'1'}, 
     {'day': '2', 'client':'client4', 'received': '12', 'approved':'5'}, 
     {'day': '3', 'client':'client1', 'received': '10', 'approved':'2'}, 
     {'day': '3', 'client':'client3', 'received': '5', 'approved':'1'}, 
     {'day': '3', 'client':'client8', 'received': '1', 'approved':'0'}, 
     {'day': '3', 'client':'client9', 'received': '2', 'approved':'2'}, 
] 

Данные для второго дня могут содержать больше или меньше клиентов, и они могут быть разными, так как клиенты, которые не сделали никаких сделок не будут присутствовать в объекте вообще. Очевидно, что этот объект содержит данные за каждый день месяца, а не только за первые три дня, как в примере, который я добавил выше.

Я использую эти данные, чтобы графически отображать их в таблице и на графиках карт на моем представлении. Это все хорошо и хорошо, но я ищу какую-то помощь - как сортировать эти данные и подсчитывать их.

Например, мой стол должен отображать общее количество транзакций за каждый день. Это означает, что мне нужно подсчитать все пары 1 день/значение дня и создать итоговые значения для каждого поля. (общее количество полученных, одобренных & пересчет процента)

Поскольку этот объект json может быть гигантским, в зависимости от количества клиентов, которые транслируются каждый день, должен ли я создать новый json-массив в моем контроллере для хранения этих ежедневных данных или есть способ, которым я могу фильтровать его и подсчитывать/пересчитывать каждый день по мере необходимости?

Моя строка таблицы выглядит следующим образом: (что также необходимо будет изменить для размещения фильтрации данных сделано в контроллере для клиента сумм)

<tr ng-repeat="daily in dailystats" ng-click="setSelected($index);" ng-class="{'selected':$index == selectedRow}"> 
        <td>{{daily.day}}</td> 
        <td>{{daily.received}}</td> 
        <td>{{daily.approved}}</td> 
        <td>{{daily.percentage}}</td> 
       </tr> 

Любая помощь будет высоко ценится, так как я не был работая долго с объектами данных json, и мне не удалось найти какие-либо ресурсы или примеры, которые помогут мне с этой задачей. Чтобы кто-то желал помочь, у вас есть моя благодарность заранее.

+0

Когда вы говорите «_this объект JSON может быть gigantic_ «Почему вообще делаете расчет клиентов? Это дает больше смысла делать это на сервере, а затем доставляет результат вычисления клиенту. – davidkonrad

+0

Вы правы. Проблема в том, что я до сих пор не знаю, как будут выглядеть данные, я просто готовлюсь к худшему сценарию. Я согласен с тем, что вычисления могут выполняться на стороне сервера, но эта часть не в моем распоряжении, и мне было любопытно, как это сделать на моем контроллере в любом случае. – geostima

ответ

1

Ниже приведен способ прохождения каждой строки в вашей таблице json и с помощью цикла for, чтобы найти все дни, равные 1, 2, 3 ... и т. Д., Затем найти «полученное» общее количество и добавить их все вместе и нажав это общее число на новый массив, затем используя ng-repeat, отображая это общее количество в таблице. Я надеюсь, что это поможет вам по правильному пути ...

Index.html

<table> 
     <thead> 
     <th>Day</th> 
     <th>Recieved</th> 
     <th>Approved</th> 
     <th>Percentage</th> 
     </thead> 
    <tbody> 
     <tr ng-repeat="daily in dailybreakdown" ng-click="setSelected($index);" ng-class="{'selected':$index == selectedRow}"> 
        <td>{{daily.day}}</td> 
        <td>{{daily.received}}</td> 
        <td>{{daily.approved}}</td> 
        <td>{{daily.percentage}}</td> 
     </tr> 
    </tbody> 
    </table> 

    <table> 
     <thead> 
     <th>Day</th> 
     <th>Recieved</th> 
     </thead> 
    <tbody> 
     <tr ng-repeat="day in days" ng-click="setSelected($index);" ng-class="{'selected':$index == selectedRow}"> 
        <td>Day {{$index + 1}}</td> 
        <td>{{day}}</td> 
     </tr> 
    </tbody> 
    </table> 

app.js
$scope.days = []; 

    $scope.dailybreakdown = [ 
     {'day': '1', 'client':'client1', 'received': '3', 'approved':'0'}, 
     {'day': '1', 'client':'client2', 'received': '8', 'approved':'1'}, 
     {'day': '1', 'client':'client3', 'received': '4', 'approved':'0'}, 
     {'day': '1', 'client':'client4', 'received': '4', 'approved':'0'}, 
     {'day': '2', 'client':'client1', 'received': '3', 'approved':'1'}, 
     {'day': '2', 'client':'client4', 'received': '12', 'approved':'5'}, 
     {'day': '3', 'client':'client1', 'received': '10', 'approved':'2'}, 
     {'day': '3', 'client':'client3', 'received': '5', 'approved':'1'}, 
     {'day': '3', 'client':'client8', 'received': '1', 'approved':'0'}, 
     {'day': '3', 'client':'client9', 'received': '2', 'approved':'2'}, 
] 


for(var x = 1; x <= 31; x++){ 
    var count = 0; 
angular.forEach($scope.dailybreakdown, function(value, key) { 

    if(value.day == x){ 
    count += parseInt(value.received,10); 
    } 
    }); 
    $scope.days.push(count); 
    console.log($scope.days); 
} 

http://plnkr.co/edit/TK9QPwkcDWSJ1NjbH95a?p=preview

+0

Большое спасибо, я проверил plunkr и, похоже, это будет шагом в правильном направлении. Я пробовал использовать стандарт в своей функции javascript, но вы, к счастью, напомнили об угловом foreach. Я также изучал использование подчеркивания, чтобы помочь мне добраться до этого решения, но, похоже, ваш ответ так же хорош. Я обновлю, как только я внедрил и протестировал. :) – geostima