JS:如何计算字母

JS: How to count in letters

我希望能够以 26 为基数进行计数,但只能使用字母表中的字母。

我可以涵盖 A + 1 = BZ + 1 = AA 等基础知识,但我希望它能像 AZZEBERBZZ

一样工作很长时间 "numbers"

目前我在JavaScript

中有以下代码
function getNextColumn(currentColumn) {
    currentColumn = currentColumn.toUpperCase();
    let lastLetterCode = currentColumn.charCodeAt(currentColumn.length - 1);

    if(lastLetterCode < 90) {
        return currentColumn.slice(0, -1) + String.fromCharCode(lastLetterCode + 1);
    } else {
        return currentColumn.slice(0, -1) + "A";
    }
}

但这里的问题是,当我在 AZ 时,它只是 returns AAA 而不是 BA

我该如何解决这个问题?

额外上下文:

我需要函数 getNextColumn,因为我使用此函数循环遍历从 excel sheet 创建的对象,其中列数在 base26 中但是只有字母没有数字

这是使用递归函数的完美候选者。

对于递归函数,您需要定义基本情况和递归情况。

您已经涵盖了基本情况,在这种情况下是 2 种情况:

  • 输入以 "Z"
  • 以外的其他字母结尾
  • 输入为"Z"

在所有其他情况下,您的 "recursive situation" 输入:

  • 以 "Z"
  • 结尾
  • 并且总共超过1个字母

对于这个 "recursive situation" 你可以 trim 最后一个 "Z" (因为无论如何你都需要用 "A" 替换它)然后再次调用这个函数,比如所以:

function getNextColumn(currentColumn) {
    currentColumn = currentColumn.toUpperCase();
    let lastLetterCode = currentColumn.charCodeAt(currentColumn.length - 1);

    if(currentColumn === "Z"){
        return "AA";
    }

    if(lastLetterCode < 90) {
        return currentColumn.slice(0, -1) + String.fromCharCode(lastLetterCode + 1);
    }

    return getNextColumn(currentColumn.slice(0, -1)) + "A";
}

基本上,您可以使用一个函数获取数值,使用另一个函数将数值转换回所需格式。这允许进行算术运算。

要获取数字,可以使用 parseInt with base 36 and a correction of 9 (this gets only the value of letters) for the value and Array#reduce 获取字母的整数。

26 的因数是字母表的长度,再往左一个字母的位值为 26 倍。

要返回转换后的值,您可以使用 toString 和基数 36 来转换为想要的字母。

function getValue(s) {
    return s.split('').reduce((r, a) => r * 26 + parseInt(a, 36) - 9, 0) - 1;
}

function setValue(n) {
    var result = '';
    do {
        result = (n % 26 + 10).toString(36) + result;
        n = Math.floor(n / 26) - 1;
    } while (n >= 0)
    return result.toUpperCase();
}

console.log(getValue('A'));              //    0
console.log(setValue(getValue('A')));
console.log(getValue('B'));              //    1
console.log(setValue(getValue('B')));
console.log(getValue('Z'));              //   25
console.log(setValue(getValue('Z')));
console.log(getValue('AA'));             //   26
console.log(setValue(getValue('AA')));
console.log(getValue('AZ'));             //   51
console.log(setValue(getValue('AZ')));
console.log(getValue('CZ'));             //  103
console.log(setValue(getValue('CZ')));
console.log(getValue('ZZ'));             //  701
console.log(setValue(getValue('ZZ')));
console.log(getValue('DXH'));            // 3335
console.log(setValue(getValue('DXH')));
.as-console-wrapper { max-height: 100% !important; top: 0; }