Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.06.2020, 16:15
Новичок на форуме
Отправить личное сообщение для wantToAsk Посмотреть профиль Найти все сообщения от wantToAsk
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 26.06.2020, 16:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Хватит и одного цикла. Исходные:
массив, в который будет помещаться
индекс этого массива, 0

В цикле прохода по строке:

если символ, помещаете в массив по индексу, если не определен еще этот элемент массива, иначе конкатенация с значением этого элемента

если знак препинания, инкремент индекса массива, помещаем знак в элемент, инкремент индекса

и далее ...
Ответить с цитированием
  #3 (permalink)  
Старый 26.06.2020, 17:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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>
Ответить с цитированием
  #4 (permalink)  
Старый 26.06.2020, 17:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 26.06.2020, 17:43
Новичок на форуме
Отправить личное сообщение для wantToAsk Посмотреть профиль Найти все сообщения от wantToAsk
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 26.06.2020, 18:54
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 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)
Ответить с цитированием
  #7 (permalink)  
Старый 27.06.2020, 02:19
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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));
Ответить с цитированием
  #8 (permalink)  
Старый 27.06.2020, 11:58
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

некорректно поствалена задача задача
1. не указан алфавит, кодировка символов
2. не указаны разделители в соответстви с п 1
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
slidetoggle без использования jquery Aligatro Общие вопросы Javascript 12 18.02.2014 21:37
Почему можно использовать id элемента без использования getElementById? grifangel Общие вопросы Javascript 3 08.01.2014 22:20
Получить массив без повторяющихся элементов truten Общие вопросы Javascript 5 15.12.2013 20:35
Вычесть один массив из другого без использования цикла Casufi Общие вопросы Javascript 1 16.01.2013 20:21
Запуск браузера (IE6 и выше) без "офорлмения" - без панелей, меню, строки состояния jett Events/DOM/Window 4 23.11.2011 15:58