26.06.2020, 16:15
|
Новичок на форуме
|
|
Регистрация: 26.06.2020
Сообщений: 2
|
|
Массив из слов и символов из строки без использования методов
Необходимо написать функцию, которая будет из слов и символов строки формировать массив. Например, из строки 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);
}
Последний раз редактировалось wantToAsk, 26.06.2020 в 16:37.
|
|
26.06.2020, 16:48
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Хватит и одного цикла. Исходные:
массив, в который будет помещаться
индекс этого массива, 0
В цикле прохода по строке:
если символ, помещаете в массив по индексу, если не определен еще этот элемент массива, иначе конкатенация с значением этого элемента
если знак препинания, инкремент индекса массива, помещаем знак в элемент, инкремент индекса
и далее ...
|
|
26.06.2020, 17:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
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>
|
|
26.06.2020, 17:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
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. Исправлено, иначе могут быть пустые элементы.
Последний раз редактировалось laimas, 26.06.2020 в 17:57.
|
|
26.06.2020, 17:43
|
Новичок на форуме
|
|
Регистрация: 26.06.2020
Сообщений: 2
|
|
Спасибо! это гораздо лучше, чем то, что получилось у меня! На всякий случай мой код по Вашему алгоритму, вдруг кому-то пригодится:
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);
}
Последний раз редактировалось wantToAsk, 26.06.2020 в 21:02.
|
|
26.06.2020, 18:54
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 642
|
|
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)
|
|
27.06.2020, 02:19
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
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));
|
|
27.06.2020, 11:58
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
некорректно поствалена задача задача
1. не указан алфавит, кодировка символов
2. не указаны разделители в соответстви с п 1
|
|
|
|