Таким образом, эта функция позволяет получить буквенный или кратный символ в зависимости от того, какой номер вы отправляете. Я хочу изменить эту функцию, чтобы при отправке символа я получал номер. Я смог достичь этого с помощью одной буквы.

Я уже создал буквенную систему идентификаторов, сначала сгенерировав число, а затем преобразовав его в букву в алфавите, используя этот идентификатор в качестве индекса. Но то, что я хочу сделать, это после того, как 26 символов были использованы, я хотел бы, чтобы он продолжал с AA, AB, AC и так далее.

РЕДАКТИРОВАТЬ: Я хочу уточнить, что я думал, что конвертер должен выходить за пределы А-серии. Таким образом, после AZ он идет в BA BB .. BZ, CA CB CC и так далее. Также то, что я хочу получить, это число, а не буква. Оригинальная функция дает мне буквы, теперь мне нужно повернуть их вспять, чтобы вернуть номер, который я отправил в предыдущей функции

function convertNumberToId (number) {
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');

    if (number < alphabet.length) {
      return alphabet[number];
    } else {
      return (
        convertNumberToId(Math.floor(number / alphabet.length) - 1)
        +
        convertNumberToId(number % alphabet.length)
      );
    }
}

В операторе if вы получите письмо обратно, если число не превышает длину массива, но как только оно будет получено, вы получите AA, AB, AC и так далее. Теперь я хочу изменить это.

Вот чего я до сих пор добился:

function convertIdToNumber(id){
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
    if($.inArray(id , alphabet) !== -1){
        return alphabet.indexOf(id);
    }
    else{

    }

}
3
Ivan Sedelkin 13 Апр 2019 в 03:00

2 ответа

Лучший ответ
function convertIdToNumber(id){
    const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
    if ($.inArray(id , alphabet) !== -1){
        // Can remove the add one here if you want 'a' = 0 
        return alphabet.indexOf(id) + 1; 
    } else {      
        return (Math.pow(26, id.length - 1) * (alphabet.indexOf(id.charAt(0)) + 1)) +  convertIdToNumber(id.slice(1));
    }
}
console.log(convertIdToNumber("aa")); // 27
console.log(convertIdToNumber("ab")); // 28
console.log(convertIdToNumber("ac")); // 29
console.log(convertIdToNumber("zz")); // 702
console.log(convertIdToNumber("abc")); // 731

Демоверсия JQuery: https://jsfiddle.net/chkt65n7/5/

Я использовал вашу исходную функцию, но я предположил, что «a» в этом случае было 1, поскольку вы упомянули, что «aa» было 27, но если эта часть отличается, то вы можете минус один из завершающего рекурсивного случая, если хотите.

Изменено для обработки более 2 символов в строке

0
mding5692 13 Апр 2019 в 02:13

ПЕРЕСМОТРЕНО (Начните с индекса 0)

Теперь мы вычисляем значение справа налево. При перемещении влево значение символа умножается на длину алфавита, увеличенную до количества цифр, которые вы переместили влево. Ручка со смещением 1.

function convertNumberToId (number) {
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');

    if (number < alphabet.length) {
      return alphabet[number];
    } else {
      return (
        convertNumberToId(Math.floor(number / alphabet.length) - 1)
        +
        convertNumberToId(number % alphabet.length)
      );
    }
}

function convertIdToNumber(id){
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
    if(id.length == 1){
        return alphabet.indexOf(id) >= 0 ? alphabet.indexOf(id) : -1;
    }
    else if (id.length > 0){
        let t = 0;
        for (let i = 0; i < id.length; i++) {
          t += (1 + convertIdToNumber(id.charAt(id.length - 1 - i))) * Math.pow(alphabet.length, i);
        }
        t--;
        return t;
    } else {
        return -1;
    }

}

console.log(convertIdToNumber('b'));
console.log(convertNumberToId(1));
console.log(convertIdToNumber('abc'));
console.log(convertNumberToId(730));

Найдите значение каждого символа в идентификаторе, добавьте длину алфавита для каждого дополнительного символа и обработайте смещение 1, если у вас есть несколько символов.

Начните с индекса 0

function convertIdToNumber(id){
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
    if(id.length == 1){
        return alphabet.indexOf(id);
    }
    else if (id.length > 0) {
        return convertIdToNumber(id.split('')[0]) 
            + alphabet.length 
            + convertIdToNumber(id.slice(1))
            + 1;
    } else {
        return -1;
    }
}

console.log(convertIdToNumber('ac'));

Начните с индекса 1

function convertIdToNumber(id){
    var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
    if(id.length == 1){
        return alphabet.indexOf(id) >= 0 ? alphabet.indexOf(id) + 1 : -1;
    }
    else if (id.length > 0) {
        return convertIdToNumber(id.split('')[0]) 
            + alphabet.length 
            + convertIdToNumber(id.slice(1))
            - 1;
    } else {
        return -1;
    }
}

console.log(convertIdToNumber('ac'));
4
kht 18 Апр 2019 в 23:23