2016-11-23 7 views
1

Я пытаюсь вычислить общее количество часов на основе "employeeId". Я не мог понять, как написать логику для этого. Каков наилучший способ решить эту проблему?Как рассчитать общее количество часов?

ожидаемый результат,

[ 
    { 

     "employeeId": "105", 
     "totalHours": "2:45" 
    }, 
    { 
     "employeeId": "777", 
     "totalHours": "2:15" 
    } 
] 

Response От Ajax вызова

[ 
    { 
     "employeeId": "105", 
     "totalHours": "1:30" 
    }, 
    { 
     "employeeId": "777", 
     "totalHours": "1:15" 
    }, 
    { 
     "employeeId": "105", 
     "totalHours": "1:15" 
    }, 
    { 
     "employeeId": "777", 
     "totalHours": "1:00" 
    } 
] 

Мой код

var jrr = new Array(); 
    Ext.Ajax.request({ 
     url: '/common/services/general/basicOperations/getDataByModelUsingGetMethod', 
     method: 'GET', 
     params : { 
     actionId : 'payroll', 
     dataJson : '{"aspectType":"Payroll Profile"}' 
     }, 
     success: function(response){ 
     try{ 
      var response = response.responseText; 
      var resObj = Ext.decode(response); 
      for(var j = 0; j < resObj.data.length; j++) 
       { 
       for(var k = 0; k < resObj.data[j].payrolltransactionDetail.length; k++) 
       { 
        jrr.push(resObj.data[j].payrolltransactionDetail[k]); 
       } 
       } 
       console.log(JSON.stringify(jrr, null, 4)); 
     } 
     catch(e){ 
      console.log(e); 
     } 
     }, 
     failure: function(response){ 
     deferred.reject("Error Fetching."); 
     } 
    }); 
+0

Я бы обработал это в запросе db. – Jecoms

+0

Я использую MongoDB. –

+0

Вы управляете фоновым контентом или вам просто предоставили API для работы? – Jecoms

ответ

1

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

var input = [ 
 
    { 
 
     "employeeId": "105", 
 
     "totalHours": "1:46" 
 
    }, 
 
    { 
 
     "employeeId": "777", 
 
     "totalHours": "1:15" 
 
    }, 
 
    { 
 
     "employeeId": "105", 
 
     "totalHours": "1:15" 
 
    }, 
 
    { 
 
     "employeeId": "777", 
 
     "totalHours": "1:00" 
 
    } 
 
] 
 

 
var obj = input.reduce(function(init, e){ 
 
    //if aggregating init object doesn't have the employee then add the employeeId (key) and time (value) 
 
    if (init[e["employeeId"]] == undefined){ 
 
     init[e["employeeId"]] = { 
 
      hours: parseInt(e["totalHours"].split(":")[0]), 
 
      minutes: parseInt(e["totalHours"].split(":")[1]) 
 
     }; 
 
     init[e["employeeId"]].timeString = e["totalHours"]; 
 
     return init; 
 
    //otherwise add to the existing employeeId the hour and minute values, while remembering to carry the extra hour if minutes exceed 59. 
 
     }else{ 
 
     init[e["employeeId"]].hours += 
 
      (parseInt(e["totalHours"].split(":")[0]) + 
 
      Math.floor((init[e["employeeId"]].minutes + 
 
      parseInt(e["totalHours"].split(":")[1]))/60)); 
 

 
     init[e["employeeId"]].minutes = 
 
      (init[e["employeeId"]].minutes + 
 
      parseInt(e["totalHours"].split(":")[1]))%60; 
 

 
     init[e["employeeId"]].timeString = 
 
      init[e["employeeId"]].minutes > 9 ? 
 
       init[e["employeeId"]].hours + ":" + init[e["employeeId"]].minutes : 
 
       init[e["employeeId"]].hours + 
 
       ":0" + init[e["employeeId"]].minutes; 
 
     return init; 
 
     } 
 
    }, {}); 
 

 
var arr = []; 
 
for (var prop in obj) arr.push({employeeId: prop, totalHours: obj[prop].timeString}); 
 
console.log(arr);

+0

Это приводит к неверному результату «3:01» для сотрудника '105'. Он также не соответствует формату, заданному в OP. –

+0

посмотреть на мой вход –

+0

Я изменил его, чтобы проверить его. –

0

Добавить, где в верхней части функции:

var totalHours = 0; 

, а затем внутренняя петля:

for(employee in resObj.data[j].payrolltransactionDetail) { 
    totalHours += employee.totalHours; 
} 

, а затем вы можете использовать его, однако вы считаете целесообразным после внешнего цикла. Если вы хотите суммировать это на транзакцию, то убедитесь, что вы сбросили на 0 перед внутренним циклом и используете после внутреннего цикла.

0
// Expecting input to be your custom object 
var output={}; 
for(i=0;i<input.length;i++){ 
el = input[i]; 
a=output[el.id]; 
a.employeId=el.employeId; 
a.totalHours=a.totalHours||"0:0"; 
b=el.totalHours.split(":"); 
c=a.totalHours.split(":"); 
b[0]=+b[0]+c[0]; 
if(b[1]+c[1]>60){ 
b[0]++; 
} 
b[1]=(+b[1]+c[1])%60; 
a.totalHours=b.join(":"); 
} 

В результате не совсем то, что вы ожидали. Я не хотел каждый раз искать идентификатор Employe в массиве:

{ 
105:{ 
    employeid:105; 
    totalHours:"15:20"; 
} 
} 
+0

Это Безразлично» t соответствует формату, предоставленному в OP. –

+1

SO isnt означает всегда давать полный ответ. Иногда ответы на них направляют OP в правильном направлении ... –

1

Вот реализация. Я думаю, что он чище, чем некоторые другие ответы:

function calc(data) { 
    const seen = {}; 
    const result = []; 

    data.forEach(item => { 
     const id = item.employeeId; 
     if (!seen.hasOwnProperty(id)) { 
      seen[id] = result.length; 
      result.push({ 
       employeeId: id, 
       minutes: 0 
      }); 
     } 
     const idx = seen[id]; 
     const parts = item.totalHours.split(':'); 
     result[idx].minutes += (parseInt(parts[0], 10) * 60) + parseInt(parts[1]); 
    }); 

    result.forEach(item => { 
     const minutes = item.minutes; 
     delete item.minutes; 
     item.totalHours = Ext.String.leftPad(Math.floor(minutes/60), 2, '0') 
          + ':' + Ext.String.leftPad(minutes % 60, 2, '0'); 
    }); 

    return result; 
} 

console.log(calc([{ 
    "employeeId": "105", 
    "totalHours": "1:30" 
}, { 
    "employeeId": "777", 
    "totalHours": "1:15" 
}, { 
    "employeeId": "105", 
    "totalHours": "1:15" 
}, { 
    "employeeId": "777", 
    "totalHours": "1:00" 
}])); 
+0

Объясните, пожалуйста, вниз. –

+0

Я объяснил, почему я остановился. Сдвиг - это потому, что «этот ответ не полезен». Вы говорите, что это не полезно? –

+0

Ваш ответ не полезен, потому что вы не объясняете ничего, что вы делаете. –

Смежные вопросы