JavaScript: Получить позицию символа в строке

379
26 ноября 2016, 17:57

Реализую функцию, которая принимает строку и возвращает позицию каждого символа в этой строке.

Функция:

alphabet_position("The sunset sets at twelve o' clock.")

Должна вернуть:

"20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"

Не получается реализовать, мой алгоритм выдаёт ошибку -1. Какой алгоритм придумать чтобы реализовать, ума не приложу.

function alphabetPosition(allLetters, letter) {  
  return allLetters.indexOf(letter);  
}  
 
var alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];  
var letter = "The sunset sets at twelve o' clock" 
var letterPosition = alphabetPosition(alphabet, letter);

Answer 1

В качестве альтернативного решения, можно использовать регулярное выражение в методе replace.

Выделить в нем две группы - символы для замены на номера, и символы для замены на пустую строку.

В самой функции замены проверить к какому диапазону относится символ, большие или маленькие буквы, и в соответствии с этим вывести нужный номер

function alphabetPosition(text) { 
  var length = text.length, 
    ACode = 65, 
    aCode = 97, 
    map = { 
      true: aCode - 1, 
      false: ACode - 1 
    }; 
  return text.replace(/([a-z])|([^a-z])/ig, function($0, char) { 
    if (!char) return ''; 
    var charCode = char.charCodeAt(0); 
    return (charCode - map[charCode >= aCode]) + ' '; 
  }).trim(); 
} 
 
console.log(alphabetPosition("The sunset sets at twelve o' clock."));

Answer 2

Ваш код все равно не выведет нужный результат, так как у вас алфавит только для строчных символов, а в строке есть и прописные (большие).

Чтобы не создавать массив с алфавитом, можно использовать функцию String.prototype.charCodeAt, которая возвращает код символа. Код символа "a" (строчная английская) равен 97:

 'a'.charCodeAt(0); // 97

Т.е. можно подсчитать номер любой буквы в английском алфавите используя symbol.charCodeAt(0) - 96 (a - 1, b - 2, c -3 и т.д.)

var sentence = 'The sunset sets at twelve o' clock';
var result = sentence
   .toLowerCase() // приводим все символы в строке к нижнему регистру
   .replace(/[^a-z-]/g, '') // удаляем все кроме букв a-z
   .split('') // преобразует строчку в массив
   .map(function(s) {
        return s.charCodeAt(0) - 96; // возвращаем номер буквы
   }
);
// на выходе получаем необходимый вам массив
console.log(JSON.stringify(result)); // "20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"
Answer 3

возвращает позицию каждого символа в строке:

function alphabetPosition(text) { 
  return text.toLowerCase().split('') 
        .filter( c => c >= 'a' & c <= 'z' ) 
        .map( c => c.charCodeAt(0) - 'a'.charCodeAt(0) + 1) 
        .join(' '); 
} 
 
console.log(alphabetPosition('n8_ovuu&'));

READ ALSO
Помогите с push уведомлениями браузера

Помогите с push уведомлениями браузера

Хочу обучиться создавать push без сервисов

264
Ajax - живой поиск (проблемы с кодом)

Ajax - живой поиск (проблемы с кодом)

Делал урок по Ajax поиску, когда вбиваю слово,оно должно проверяться через array в php файле и показывать есть ли оно или нет в array, но в результате...

336
Получить иконку с openweathermap

Получить иконку с openweathermap

Есть запрос погоды на сайт openweathermapВ JSON ответе есть в поле weather

210
Перерисовать svg на канве

Перерисовать svg на канве

Здравствуйте! Возникла задача - нарисовать и скачать svg, вот такой структуры

237