Ich habe das folgende Array, das hh enthält: mm

var times= [ '28:06', '27:56', '28:30']

Ich versuche, die durchschnittlichen Stunden und Minuten aus dem obigen Array zu berechnen

Unten ist mein Code

var times= [ '28:06', '27:56', '28:30'],
date = 0,
result = '';
function offsetify(t){
return t < 10 ? '0' + t : t;
}
for(var x = 0; x < times.length; x++ ) {
var tarr = times[x].split(':');
date += new Date(0, 0, 0, tarr[0], tarr[1]).getTime();   
}
var avg = new Date(date/times.length);
result = offsetify(avg.getHours()) + ':' + offsetify(avg.getMinutes());
console.log(result);

Das gibt mir 4:10, was falsch ist, da der Durchschnitt irgendwo bei 27 liegen sollte: ...

Was mache ich hier falsch?

1
nicole willson 22 Feb. 2020 im 09:16

4 Antworten

Beste Antwort

Sie können den Durchschnitt von Stunden- und Minutenteil einfach separat ermitteln

var times= [ '28:06', '27:56', '28:30']

function getAverage(isHourPart){
	var sum = 0;
	times.forEach(function(value){
  	sum+=parseInt(value.split(':')[isHourPart?0:1], 10);
  });
  var avg = Math.floor(sum/times.length);
  return avg<10 ? '0' + avg : avg;
}

console.log(getAverage(true)+":"+getAverage(false));

Aber wenn Sie den kombinierten Wert von Stunde und Minute berücksichtigen

var times= [ '28:06', '27:56', '28:30']

function getSum(){
	var sum = 0;
	times.forEach(function(value){
  	var item = value.split(':');
  	sum+=parseInt(item[0], 10) * 60 + parseInt(item[1], 10);
  });
  return sum;
}

function getFormattedText(value){
	return value<10?"0"+value:value;
}

var totalMinutes = getSum()/3;

var hour = Math.floor(totalMinutes/60);
var minute = Math.floor(totalMinutes - hour * 60);

console.log(getFormattedText(hour)+":"+getFormattedText(minute));
2
Ranjit Singh 22 Feb. 2020 im 06:42

Ich würde .map verwenden, um jede Zeitzeichenfolge in eine Minutenzahl umzuwandeln (z. B. 28:06 -> (28 * 60) + 6 = 1686), dann das Array zusammenfassen und durch seine Länge dividieren. Sobald Sie die durchschnittliche Anzahl von Sekunden erreicht haben, können Sie den Vorgang umkehren, um eine weitere HH:mm Zeichenfolge zu erstellen:

var times = ['28:06', '27:56', '28:30'];
const timeMins = times.map((str) => {
  const [hours, minutes] = str.split(':').map(Number);
  return minutes + (hours * 60);
});
const totalMins = timeMins.reduce((a, b) => a + b);
const avgMins = totalMins / times.length;
const hours = Math.floor(avgMins / 60);
const minutes = avgMins % 60;
console.log(hours + ':' + Math.round(minutes));
2
CertainPerformance 22 Feb. 2020 im 06:33
var times= [ '28:06', '27:56', '28:30'];

var total=0;
for(var i=0;i<times.length;i++) {
    var hour=parseInt(times[i].split(':')[0]);
    var minute=parseInt(times[i].split(':')[1]);
    total+=((hour*60)+minute);
}
var avg=parseInt(total/times.length);
var result=parseInt(avg/60)+":"+(avg%60);
console.log(result);
1
Subhasish Biswasray 22 Feb. 2020 im 06:39

Wenn Sie> 24h auf Tag umwandeln, haben Sie einen Tag verstrichen, wenn Sie den Durchschnitt machen, ist der Durchschnitt algo> 24h, daher vergeht auch ein Tag.

Aktivieren Sie avg.getDay(), um den richtigen Versatz mit der Stunde zu erzielen.

var times= [ '28:06', '27:56', '28:30'],
date = 0,
result = '';
function offsetify(t){
return t < 10 ? '0' + t : t;
}
for(var x = 0; x < times.length; x++ ) {
var tarr = times[x].split(':');
date += new Date(0, 0, 0, tarr[0], tarr[1]).getTime();   
}
var avg = new Date(date/times.length);
result = offsetify((avg.getDay() * 24) + avg.getHours()) + ':' + offsetify(avg.getMinutes());
console.log(result);

Hinweis: Ich empfehle Ihnen auch, https://momentjs.com/docs/#/durations/ zu verwenden. wenn Ihr Projekt viel Zeit kostet.

1
Coding Edgar 22 Feb. 2020 im 06:49