Массив из слов и символов из строки без использования методов
Необходимо написать функцию, которая будет из слов и символов строки формировать массив. Например, из строки Hello, world! будет сформирован массив [Hello, ,, world, !]. Использовать методы строк нельзя (например, split).
Я предположила такой алгоритм: перебор элементов строки, склеивание букв в новую переменную, если элемент равен знаку препинания или пробелу, выход из цикла, добавление в массив этой новой переменной и знака (два элемента массива), затем возвращение в цикл с того же места, где был выход, переменная для хранения склеенного слова обновляется и записывается новое слово. Вопрос, как реализовать этот алгоритм? Я попыталась написать функцию с двумя вложенными циклами, но что-то не то получилось. function stringToArray() { let line = document.getElementById("enter").value; let arrayOfSymbols = [" ", ",", ".", "!", "?"]; let lineСoncatenated = ""; let symbol = ""; let arrOfWords = []; let j = 0; while ( j < line.length) { for (let i = j; i < line.length; i++) { if(arrayOfSymbols.indexOf(line[i]) != -1) { symbol = line[i]; lineСoncatenated = ""; break; } else { lineСoncatenated += line[i]; } } arrOfWords.push(lineСoncatenated); arrOfWords.push(symbol); j += lineСoncatenated.length; } return(arrOfWords); } |
Хватит и одного цикла. Исходные:
массив, в который будет помещаться индекс этого массива, 0 В цикле прохода по строке: если символ, помещаете в массив по индексу, если не определен еще этот элемент массива, иначе конкатенация с значением этого элемента если знак препинания, инкремент индекса массива, помещаем знак в элемент, инкремент индекса и далее ... |
wantToAsk,
<script> function stringToArray(line) { let arrayOfSymbols = [",", ".", "!", "?"]; let item = ""; let arrOfWords = []; a: for (let i = 0; i < line.length; i++) { let symbol = line[i] if (symbol === " ") continue a; for (let k = 0; k < arrayOfSymbols.length; k++) { if (arrayOfSymbols[k] == symbol) { if (item) { arrOfWords.push(item); item = ""; }; arrOfWords.push(symbol); continue a } } item += symbol; } if (item) arrOfWords.push(item); return arrOfWords } let ar = stringToArray('Hello, world!'); document.write(JSON.stringify(ar, "", 4)) </script> |
let s = 'Hello, world!', mark = ['.', ',', '!', '?', ' '], a = [], i = 0; a[i] = ''; for(let n=0; n<s.length; ++n) { if(!mark.includes(s[n])) a[i] += s[n]; else{ a[++i] = s[n]; if(n+1 < s.length && !mark.includes(s[n+1])) a[++i] = ''; } } alert(a) PS. Исправлено, иначе могут быть пустые элементы. |
Спасибо! это гораздо лучше, чем то, что получилось у меня! На всякий случай мой код по Вашему алгоритму, вдруг кому-то пригодится:
function stringToArray() { let line = document.getElementById("enter").value; let arrOfSymbols = [" ", ",", ".", "!", "?"]; let index = 0; let arr = []; for (let i = 0; i < line.length; i++) { if (arrOfSymbols.indexOf(line[i]) == -1) { if (arr.length == 0) { arr[index] = line[i]; } else { arr[index] += line[i]; } } else { index++; arr[index] = line[i]; } } return(arr); } |
let result = [] for (let index = 0, string = 'Hello, World!Привет, Мир!'; index < string.length; index++) { if (result.length === 0 || !/[a-zа-яЁё]/ig.test(string[index])) { result.push(string[index]) } else { result[result.length - 1] = result[result.length - 1] + string[index] } } console.log(result); const res = [...'Hello, World!Привет, Мир!'].reduce((acc, letter) => { !acc.length || !/[a-zа-яЁё]/ig.test(letter) ? acc.push(letter) : acc[acc.length - 1] += letter return acc }, []); console.log(res) |
function stringToArray(s) { var arr = [], m, rx = /[a-zа-яё]+|./ig; while(m = rx.exec(s)) { arr.push(m[0]); } return arr; } var a = stringToArray('Hello, world!'); alert(JSON.stringify(a, '', 4)); |
некорректно поствалена задача задача
1. не указан алфавит, кодировка символов 2. не указаны разделители в соответстви с п 1 :-/ |
Часовой пояс GMT +3, время: 18:15. |