中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在js中做數字字符串補0(js補零)

發布時間:2020-09-21 13:42:10 來源:腳本之家 閱讀:174 作者:mdxy-dxy 欄目:web開發

通常遇到的一個問題是日期的“1976-02-03 HH:mm:ss”這種格式 ,我的比較簡單的處理方法是這樣:

function formatDate(d) {
 var D=['00','01','02','03','04','05','06','07','08','09']
 with (d || new Date) return [
  [getFullYear(), D[getMonth()+1]||getMonth()+1, D[getDate()]||getDate()].join('-'),
  [D[getHours()]||getHours(), D[getMinutes()]||getMinutes(), D[getSeconds()]||getSeconds()].join(':')
 ].join(' ');
}

這種方法是邏輯比較簡單的,而且規則也簡單。除了with(d||new Date)的使用之外,也算不上什么技巧。但是,如果用這種方法來做數字字符串補0,那么結果顯然不妙。51js的月影提供了另一個方案:

function pad(num, n) {
 return Array(n>num?(n-(''+num).length+1):0).join(0)+num;
}

調用示例如下:

pad(100, 4); // 輸出:0100

月影在這里分析了其中的技巧,以及代碼長短與效率上的平衡:
最后月影推薦的是“質樸長存法”:

/* 質樸長存法 by lifesinger */
function pad(num, n) {
  var len = num.toString().length;
  while(len < n) {
    num = "0" + num;
    len++;
  }
  return num;
}

這個在“沒事就射鳥”同學的博客里做了分析
月影同學有一件事是沒有做的,就是沒說明“為什么那個短代碼的效率更低?”。
答案是“表面看來,用array.join來替代循環是高效的,但忘掉了一個數組創建的開銷”。對此有沒有法子呢?我有過另一個解決的思路。如下:

/* 查表法(不完善) by aimingoo */
pad = function(tbl) {
 return function(num, n) {
  return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num);
 }
}([]);

這個路子跟前面的formatDate()是一樣的,只不是formatDate()里的表是一個確定的數組,而這里的數組則是動態生成,然后緩存在tbl[]里面。這個緩存的tbl[]數組是使用一個函數調用參數的形式,保持在最終的pad()函數的上層閉包里面。為了讓上面的這個過程清晰一點,我重排代碼格式如下:

pad = function(tbl) {
 return function(num, n) {
  return (
   ((tbl[n = n-num.toString().length]) ||
    (tbl[n] = Array(n).join(0))) +
   num
  );
 }
}([]);

好的。到這里,先別急,還有兩個問題要解決。其一,當不需要補0時,上述的tbl[0]返回空值,所以會進入到“||”運算的第二個分支,因此導致Array()重算一次,也就是說“不補0的情況效率其實最低”。其二,當num長度大于n時,也就變成了“補負數個零”。“補負數個零”顯然不行,一般對此處理成“不需要補零”,于是又回到了第一個問題。

這兩個問題可以一次解決,其實就是多一次判斷:

/* 查表法(完善版本) by aimingoo */
pad = function(tbl) {
 return function(num, n) {
  return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num;
 }
}([]);

當然,也可以象前面一樣整理一下這個代碼格式。或者,采用一個完全不用“(函數式語言的)連續運算等技巧”的版本:

/* 查表法(過程式版本) by aimingoo */
pad = function() {
 var tbl = [];
 return function(num, n) {
  var len = n-num.toString().length;
  if (len <= 0) return num;
  if (!tbl[len]) tbl[len] = (new Array(len+1)).join('0');
  return tbl[len] + num;
 }
}();

算法永遠都是如此,要不是時間換空間,要不就是空間換時間。射雕同學的“質樸長存法”是時間換空間的方法,而這里的查表法則是空間換時間的方案。這個函數會在tbl中持續一個字符串數組,如果num是非常經常變化的,那么效率也不會有太大提升——對于過于頻繁變化的系統,緩存就意義不大了。其實邏輯都差不多,月影同學只是少走了一步而已。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洪雅县| 丰城市| 湖北省| 伊吾县| 徐汇区| 赤城县| 漯河市| 彭泽县| 定襄县| 石屏县| 景德镇市| 安溪县| 新和县| 漯河市| 周至县| 福鼎市| 宝兴县| 台安县| 钟祥市| 镇雄县| 宽甸| 永吉县| 乌拉特前旗| 白朗县| 合作市| 右玉县| 锡林郭勒盟| 巴东县| 新野县| 阳东县| 梅河口市| 太仆寺旗| 鄂托克前旗| 霍州市| 施甸县| 福鼎市| 承德市| 象州县| 潞城市| 凤翔县| 包头市|