2013-07-21 21 views
0

我在我的應用程序中有一個版本號屬性,它只是一個字符串。我需要傳入當前值並計算下一個有效值並返回該值。如何使用javascript來計算下一個版本號

這裏是有效的進展:

.A 
.B 
.C 
0 
0.A 
0.B 
1 
1.A 
etc 

全忘了號碼,在其他位置控制。這隻涉及具有時期的那些。 的限制有:

  • 第一部分始終是一個號碼(或沒有)
  • 然後過一段
  • 然後一個字母,但不包括我和O(因爲他們像1和0),一旦你到達ž應該到AA,AB,AC,...,ZZ

所以

If I pass in .A it should return .B 
If I pass in 1.H it should pass back 1.J 
If I pass in 1.Z it should pass back 1.AA 

任何幫助將不勝感激。

這裏是我 - 我只是不知道該信部如何 「增量」:

function calcNextRev(currentRev) 
{ 
var revParts = currentRev.split("."); 
var majorRev = revParts[0]; 
var currentMinorRev = revParts[1]; 

??? 

return majorRev + "." + newMinorRev; 
} 
+0

因此,要求是明確的,你嘗試過這麼遠嗎? – Teemu

+0

更新後的第一篇文章 – trueimage

+0

你寫了「1.Z它應該回傳1.AA」或2.A?什麼時候來2.x? – Sergio

回答

2

試試這個:

(demo here)

VAR alfab = 'A' ,'B','C','D','E','F','G','H','J','K','L','M','N',' P,Q,R,S,T,U,V,W,Y,Z, var currentRev ='0.AZ'; var result;

function calcNextRev(currentRev) { 
var newMinorRev; 
var revParts = currentRev.split("."); 
var majorRev = revParts[0]; 
var currentMinorRev = revParts[1]; 
//Case string is 1 letter long 
if (currentMinorRev.length == 1) { 
    for (i = 0; i < alfab.length; i++) { 
     if (currentMinorRev == alfab[i]) { 
      if (i == alfab.length - 1) { 
       newMinorRev = alfab[0] + alfab[0]; 
      } else { 
       var ii = i + 1; 
       newMinorRev = alfab[ii]; 
      } 
     } 
    } 
} 
//Case string is more than one letter long 
if (currentMinorRev.length > 1) { 
    var currentMinorRev2 = currentMinorRev.split(""); 
    var l = currentMinorRev2.length - 1; 
    for (o = 0; o < alfab.length; o++) { 
     if (currentMinorRev2[l] == alfab[o] && o == alfab.length - 1) 
     { 
      var currentalias = currentMinorRev2; 
      currentalias[l] = alfab[0]; 
      currentalias.push(alfab[0]); 
      newMinorRev = currentalias.join(''); 
     } 
     if (currentMinorRev2[l] == alfab[o] && o != alfab.length - 1) 
     { 
      var xo = o + 1; 
      var currentalias = currentMinorRev2; 
      currentalias[l] = alfab[xo]; 
      newMinorRev = currentalias.join(''); 
      o++; 

     } 
    } 
}; 
result = majorRev + "." + newMinorRev; 
return result; 
} 

alert(calcNextRev(currentRev)); 
+0

似乎.Z轉到.ZA,但它應該轉到.AA – trueimage

+0

也是,主要修改不應該增加 - 有一個完全獨立的功能已經在做這個 – trueimage

+0

@trueimage,好的。修復並更新了答案。 – Sergio

2

基本上你在做什麼是在基地24計數,儘管,並使用作爲數字ABCDEFGHJKLMNPQRSTUVWXYZ,而不是「正常」 ABCDEFGHIJKLMNO。所以我們將使用JavaScript的鮮爲人知的能力處理非基數爲10的數字,形式爲parseInt(value,base)value.toString(base)

var letters = "ABCDEFGHJKLMNPQRSTUVWXYZ".split(""), 
    base24_to_letters_map = {}, 
    letters_to_base24_map = {}; 

// Build maps from base 24 digits to desired range of letters and vice versa 
for (var i=0; i<24; i++) { 
    base24_to_letters_map[i.toString(24)] = letters[i]; 
    letters_to_base24_map[letters[i]] = i.toString(24).toUpperCase(); 
} 

// Convert each digit in "val" based on "map" 
function convert (val, map) { 
    return val.replace(/[0-9A-Z]/g, function(chr) { return map[chr]; }); 
} 

function increment (version) { 
    var base24, number; 

    base24 = convert (version, letters_to_base24_map); // convert "BJ" to "1A" 
    number = parseInt (base24, 24);      // convert "1A" to 34 
    number++;           // increment 
    base24 = number.toString (24);      // convert 35 to "1B" 
    version = convert (base24, base24_to_letters_map); // convert 1B to BK 

    return version; 
} 

這也給你三個字母和更多的版本號「免費」; 「ZZ」將轉到「AAA」。另外,它可以讓你輕鬆地跳轉任何數量的版本。

要處理的領先數字版本號:

full_version.replace(/[A-Z][A-Z]?/, function (letter_portion) { 
    return increment (letter_portion); 
}); 
+0

這個看起來不錯,但我發現了兩個問題: 你應該引用「letters_to_base24_map」而不是「letters_to_base24」增值功能,同樣以「base24_to_letters」 也.ZZ去.BAA代替.AAA – trueimage

+0

我仍然不確定爲什麼.Z - > .BA,.ZZ - > .BAA等,而不是.AA和.AAA。否則,它完美的作品。 – trueimage

+0

+1(爲':)') – Sergio

相關問題