2017-09-01 3 views
0

sah ich eine Frage online, die ein Programm benötigten numerische Sekunden in Sekunden, Minuten zu konvertieren, Stunden, Tage, Jahre und ich war in der Lage mit dieser Funktion zu kommen unterSekunden Klar rekursive Funktion

var arrTime = []; 
function formatD(seconds){ 
    if(seconds > 0){ 
     if(seconds >= 1 && seconds <= 59){ 
      arrTime.push(seconds === 1 ? "1 second" : seconds + " seconds"); 
      return arrTime; 
     }else 
     if(seconds >= 60 && seconds <= 3599){ 
      arrTime.push(seconds === 60 ? "1 minute" : Math.floor(seconds/60) + " minutes"); 
      formatD(seconds - (Math.floor(seconds/60) * 60)); 
     }else 
     if(seconds >= 3600 && seconds <= 86399){ 
      arrTime.push(seconds === 3600 ? "1 hour" : Math.floor(seconds/3600) + " hours"); 
      formatD(seconds - (Math.floor(seconds/3600) * 3600))  
     }else 
     if(seconds >= 86400 && seconds <= 31535999){ 
      arrTime.push(seconds === 86400 ? "1 day" : Math.floor(seconds/86400) + " hours"); 
      formatD(seconds - (Math.floor(seconds/86400) * 86400))  
     }else{ 
      arrTime.push(seconds === 31536000 ? "1 year" : Math.floor(seconds/31536000) + " years"); 
      formatD(seconds - (Math.floor(seconds/31536000) * 31536000))    
     } 
    } 
} 

ich habe meinen Code und mit meinem Grunde Rekursion Wissen studiert, dachte ich, das ein Array mit dem Ergebnis, zum Beispiel zurückkommen würde, wenn ich

formatD(63) 
eingegeben

i erwartet, um zu sehen:

["1 minute", "3 seconds"] 

Aber ich bekomme keinen Rückgabewert..irgend damit oder irgendwas macht hier was falsch?

+1

Weil Sie nichts zurückgeben, außer im ersten if-Block. –

+0

gerade realisiert, dass @PatrickEvans – olayemii

Antwort

1

Überprüfen Sie einfach Ihre arrTime Array.

Und auch zurück arrTime von der Methode, die Sie geschrieben haben.

Das sollte die Zeit enthalten.

var arrTime = new Array(); 
 
function formatD(seconds){ 
 
    if(seconds > 0){ 
 
     if(seconds >= 1 && seconds <= 59){ 
 
      arrTime.push(seconds === 1 ? "1 second" : seconds + " seconds"); 
 
      return arrTime; 
 
     }else if(seconds >= 60 && seconds <= 3599){ 
 
      arrTime.push(seconds === 60 ? "1 minute" : Math.floor(seconds/60) + " minutes"); 
 
      formatD(seconds - (Math.floor(seconds/60) * 60)); 
 
     }else if(seconds >= 3600 && seconds <= 86399){ 
 
      arrTime.push(seconds === 3600 ? "1 hour" : Math.floor(seconds/3600) + " hours"); 
 
      formatD(seconds - (Math.floor(seconds/3600) * 3600))  
 
     }else if(seconds >= 86400 && seconds <= 31535999){ 
 
      arrTime.push(seconds === 86400 ? "1 day" : Math.floor(seconds/86400) + " hours"); 
 
      formatD(seconds - (Math.floor(seconds/86400) * 86400))  
 
     }else{ 
 
      arrTime.push(seconds === 31536000 ? "1 year" : Math.floor(seconds/31536000) + " years"); 
 
      formatD(seconds - (Math.floor(seconds/31536000) * 31536000))    
 
     } 
 
    } 
 

 
    return arrTime; 
 
} 
 
console.log(formatD(65)); 
 
console.log(arrTime);

+0

Works, aber ich habe immer noch leiden die globale Variable an die neuen Werte anhängen jedes Mal, wenn ich die Funktion aufrufen :( – olayemii

+0

Setzen Sie die 'arrTime' in einer anderen Methode und rufen Sie Ihre Methode von dort –

1

Sie Array#reduce mit zwei Arrays für Einheit und entsprechenden Wert von Sekunden verwenden könnten.

Um mehrere Wörter zu erhalten, könnten Sie ein Objekt mit Wörtern für eine Einheit und andere Zählungen verwenden.

function formatD(seconds) { 
 
    function getPlural(number, word) { 
 
     return number === 1 && word.one || word.other; 
 
    } 
 

 
    var words = { 
 
      year: { one: 'year', other: 'years' }, 
 
      day: { one: 'day', other: 'days' }, 
 
      hour: { one: 'hour', other: 'hours' }, 
 
      minute: { one: 'minute', other: 'minutes' }, 
 
      second: { one: 'second', other: 'seconds' } 
 
     }, 
 
     units = ['year', 'day', 'hour', 'minute', 'second'], 
 
     values = [365 * 24 * 60 * 60, 24 * 60 * 60, 60 * 60, 60, 1], 
 
     result = []; 
 

 
    units.reduce(function (s, u, i) { 
 
     var temp = Math.floor(s/values[i]); 
 
     if (temp) { 
 
      result.push(temp + ' ' + getPlural(temp, words[u])); 
 
     } 
 
     return s % values[i]; 
 
    }, seconds); 
 
    return result.join(' '); 
 
} 
 

 
console.log(formatD(63)); 
 
console.log(formatD(3600)); 
 
console.log(formatD(31536000)); 
 
console.log(formatD(31626102));
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

var n = 10000; 
 
var hourre = n%3600; 
 
n = n-hourre; 
 
var hours = n; 
 
n = hourre; 
 
var minutesre = n%60; 
 
var minutes = n - minutesre; 
 
seconds = n- minutes; 
 
n = n - seconds 
 
alert("hours:"+hours/3600+"minutes:"+minutes/60+"seconds:"+seconds);

Ich denke, das ist billig ...% bekommt den Rest einer Division.