2017-09-01 45 views
0

我看到這需要一個程序,數字秒轉換成秒,分鐘,小時,天,多年的問題在網上和我能想出這個功能下面秒到人類可讀的遞歸函數

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))    
     } 
    } 
} 

我研究我的代碼,並與我的基本知識遞歸,我認爲這將返回一個數組,包括結果,例如,如果我進入

formatD(63) 

我期望看到:

["1 minute", "3 seconds"] 

但我一直沒有返回值..任何修復或某事在這裏做錯了嗎?

+1

因爲除了第一個if塊以外,你沒有返回任何東西。 –

+0

剛剛意識到@PatrickEvans – olayemii

回答

1

只需檢查您的arrTime陣列。

並且還從您編寫的方法返回arrTime

這應該包含時間。

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

的作品,但我仍然需要在每次調用該函數時受到新值附加的全局變量:( – olayemii

+0

將'arrTime'放在另一個方法中並從那裏調用您的方法 –

1

你可以使用Array#reduce與兩個陣列爲單位和以秒對應的值。

對於獲取複數單詞,您可以使用一個單詞的對象和其他計數。

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);

我認爲這是正確的...%得到一個除法的餘數。