#javascript #jquery
#javascript #jquery
Вопрос:
Таким образом, эта функция позволяет получить символ алфавита или несколько символов в зависимости от того, какой номер вы отправляете. Я хочу изменить эту функцию, чтобы при отправке символа я получал число. Я смог добиться этого с помощью отдельных букв.
Я уже создал систему алфавитных идентификаторов, сначала сгенерировав число, а затем преобразовав его в букву алфавита, используя этот идентификатор в качестве индекса. Но то, что я хочу сделать, это после того, как было использовано 26 символов, я бы хотел, чтобы это продолжалось с AA, AB, AC и так далее.
РЕДАКТИРОВАТЬ: я хочу уточнить, что я думал, что конвертер должен выходить за рамки A-series. Итак, после 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{
}
}
Комментарии:
1. итак, вы хотите вернуть символ на основе его индекса в алфавите?
2. @mding5692 Я думаю, что он уже это делает. Он хочет, чтобы он возвращал AA, если вы вводите, скажем, 27, AB, если вы вводите 28. По крайней мере, так я это понял
3. @Ronnie Да, это совершенно правильно
4. Я чувствую, что маршрут состоит в том, чтобы взять разницу в 26 символов, а затем выполнить другой индекс, так что like
28 % 26
дает вам остаток от 2, который будет равен B. Очевидно, что сейчас вы не думаете о нулевом значении, но вы поняли идею5. Вы имеете в виду, как исходная функция, преобразующая число в буквы алфавита?
Ответ №1:
ИСПРАВЛЕНО (начинается с индекса 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'));
Комментарии:
1. Это отличный ответ, но не допускает продолжения за пределами A-серии. То, о чем я думаю, продолжается после AZ в направлении BA BB BC и так далее
2. @IvanSedelkin Я считаю, что обновление допускает продолжение за пределами A-серии и любого количества символов в идентификаторе.
3. Существует проблема с числами ниже 26. Пример
convertNumberToId('5') !== convertIdToNumber(convertNumberToId('5'))
. Сделал небольшой тест, чтобы проиллюстрировать проблему jsbin.com/qehopozequ/edit?js ,консоль4. @Пабло, ты прав! Я предположил, что ‘a’ равно 1, исправлено, чтобы исправить эту проблему
Ответ №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 символов в строке