Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8

Реализация нативного .split() без любых нативных методов

16.10.2023, 10:13. Показов 2518. Ответов 24

Приветствую всех!

Задача следующая: необходимо реализовать нативный строковый метод .split() с использованием ТОЛЬКО ОДНОГО цикла for и (по необходимости) методы .charCodeAt() и .fromCharCode(). Любые другие нативные методы запрещены!

Хотелось бы увидеть максимально грамотную, лаконичную и понятную реализацию.

Для примера прикрепляю свой вариант, мне он не нравится, его тяжело читать и обслуживать, однако он работает:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function split(text, divider = null) {
  if (divider === null) {
    return [text];
  }
 
  const result = [];
 
  let stringAccum = "";
 
  let dividerIndex = 0;
  let currDivider = "";
  let repeat = true;
 
  for (let i = 0; i < text.length; i++) {
    if (divider === "") {
      result[result.length] = text[i];
      continue;
    }
 
    const check = divider[dividerIndex] ?? null;
 
    // console.log(
    //   `text: ${text[i]}`,
    //   `check: ${check}`,
    //   `currDivider: ${currDivider}`
    // );
 
    if (check) {
      if (check === text[i]) {
        dividerIndex++;
        if (currDivider === divider) currDivider = "";
        if (stringAccum) {
          if (i === text.length - 1 && currDivider !== divider) {
            currDivider += text[i];
            if (currDivider !== divider) {
              result[result.length] = stringAccum + currDivider;
            } else if (currDivider === divider) {
              result[result.length] = stringAccum;
              result[result.length] = "";
            }
            // result[result.length] = stringAccum + currDivider;
            break;
          }
 
          if (divider.length === 1) {
            result[result.length] = stringAccum + currDivider;
            stringAccum = "";
          }
        }
        currDivider += text[i];
        if (i === text.length - 1 && currDivider !== divider) {
          result[result.length] = currDivider;
        } else if (i === text.length - 1 && currDivider === divider) {
          result[result.length] = "";
        }
      } else if (check !== text[i]) {
        repeat = false;
        dividerIndex = 0;
        if (currDivider === divider) currDivider = "";
        stringAccum += currDivider;
        currDivider = "";
        stringAccum += text[i];
        if (i === text.length - 1) {
          result[result.length] = stringAccum;
        }
      }
    } else if (!check) {
      dividerIndex = 0;
      const check = divider[dividerIndex] ?? null;
 
      if (repeat) result[result.length] = "";
 
      if (check === text[i]) {
        repeat = true;
        dividerIndex++;
        if (currDivider === divider) currDivider = "";
        if (stringAccum) result[result.length] = stringAccum + currDivider;
        currDivider += text[i];
        stringAccum = "";
        if (i === text.length - 1 && currDivider !== divider) {
          result[result.length] = currDivider;
        } else if (i === text.length - 1 && currDivider === divider) {
          result[result.length] = "";
        }
      } else if (check !== text[i]) {
        dividerIndex = 0;
        repeat = false;
        if (currDivider === divider) currDivider = "";
        stringAccum += currDivider;
        stringAccum += text[i];
        if (i === text.length - 1) {
          result[result.length] = stringAccum;
        }
      }
    }
  }
 
  return result;
}
Добавлено через 17 минут
Нужно в точности повторить поведение нативного .split(). Темы, которые Вы кидаете лишь коссвенно касаются моего вопроса, а не отвечают на него
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2023, 10:13
Ответы с готовыми решениями:

Найти в строке самое длинное слово без split, для типа string, не используя методов класса
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication28 { ...

JNI. Проблема с вызовом нативных методов
Привет всем! Братцы, кто работал с нативными методами?! Моя программа должна работать с устройством, висящим на LPT-порте. Для этого...

Реализация двоичного дерева без использования готовых методов
Есть ли примеры кода, как реализовать двоичное дерево без использования готовых методов.

24
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2121 / 833
Регистрация: 13.03.2010
Сообщений: 6,965
18.10.2023, 12:42
dull-, разрешаете функции принимать любые данные без валидации и утверждаете, что всё работает.

Умерьте свой пыл в общении, иначе придётся "быковать" в другом месте.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
18.10.2023, 12:43
Ради смеха, алгоритмом Кнута-Морриса-Пратта:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
function buildPrefixTable(input) {
  let pos = 1, cnd = 0;
  let result = Array(input.length + 1).fill(0);
  result[0] = -1;
 
  while (pos < input.length) {
    if (input[pos] === input[cnd]) {
      result[pos] = result[cnd];
    } else {
      result[pos] = cnd;
      while (cnd >= 0 && input[pos] !== input[cnd]) {
        cnd = result[cnd];
      }
    }
    pos += 1;
    cnd += 1;
  }
 
  result[pos] = cnd;
  return result;
}
 
function kmpSearch(haystack, needle) {
  const prefixes = buildPrefixTable(needle);
  let result = [];
 
  let haystackIter = 0, needleIter = 0;
 
  while (haystackIter < haystack.length) {
    if (haystack[haystackIter] === needle[needleIter]) {
      haystackIter += 1;
      needleIter += 1;
 
      if (needleIter === needle.length) {
        result.push(haystackIter - needleIter);
        needleIter = prefixes[needleIter];
      }
    } else {
      needleIter = prefixes[needleIter];
      if (needleIter < 0) {
        haystackIter += 1;
        needleIter += 1;
      }
    }
  }
 
  return result;
}
 
function split(string, delimiter = "") {
  if (typeof string !== "string") {
    throw new TypeError(`Expected string, got ${typeof string}`);
  }
  delimiter = String(delimiter);
 
  if (delimiter.length === 0) {
    return [...string];
  }
 
  const positions = kmpSearch(string, delimiter);
  let result = [];
  let startSegmentIndex = 0;
 
  for (const position of positions) {
    if (startSegmentIndex !== position) {
      const segment = string.slice(startSegmentIndex, position);
      result.push(segment);
    }
    startSegmentIndex = position + delimiter.length;
  }
 
  if (startSegmentIndex !== string.length) {
    const lastSegment = string.slice(startSegmentIndex, string.length);
    result.push(lastSegment);
  }
 
  return result;
}
1
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
18.10.2023, 15:08
dull-, реагируй спокойнее, напиши, что просто немного срезал углы, это нормально и поблагодари за совет.
Eva Rosalene, интересное решение, я читал про этот алгоритм, но вспомнить его и воспроизвести без справочника для меня сложно, молодец что не поленилась
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
18.10.2023, 17:18

Не по теме:

Цитата Сообщение от mr_dramm Посмотреть сообщение
вспомнить его и воспроизвести без справочника для меня сложно, молодец что не поленилась
Я тоже со справочником :)



Добавлено через 5 минут
Цитата Сообщение от gogolik Посмотреть сообщение
dull-, разрешаете функции принимать любые данные без валидации и утверждаете, что всё работает.
Цитата Сообщение от KingdaKa Посмотреть сообщение
dull-, вы про валидацию входящих данных слышали вообще?
Не соглашусь, кстати. Валидировать инпуты от конечного юзера – это одно, но совсем другое – если функция сама про себя заявляет "меня можно вызывать только с такими-то и такими-то данными"; это перекладывает ответственность за валидацию на вызывающую сторону. В публичном апи разве что такое не очень комильфо делать, но бывают разные кейсы.

Добавлено через 2 минуты
А вообще, кстати, вот, можете взять и реализовать по букве:
https://262.ecma-international... type.split
Будет самый близкий к оригиналу вариант.
1
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
18.10.2023, 18:23
Цитата Сообщение от Eva Rosalene Посмотреть сообщение
функция сама про себя заявляет "меня можно вызывать только с такими-то и такими-то данными"
Функция сама ничего никому не заявляет, для этого есть ман
Нам же методы выдают ошибку, когда вместо, например, строки передаем число, ы? Фигню-то не вычисляют.
Это и есть валидация в данном случае.
Если аргументов не хватает - тоже будет ошибка, а не ерунда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2023, 18:23

Преобразовать строку в набор чисел (единичный ввод без пробелов, т.е. без Split)
string? chislo = Console.ReadLine(); for (int i = 0; i &lt; chislo.Length; i++) { int b = Convert.ToInt32(chislo); ...

Реализация функции split
Всех приветствую. Я знаю, что этот вопрос очень часто задают программисты на lua, но тем не менее я не нашёл подходящей для меня реализации...

реализация php функции split()
Помогите реализовать функцию split(); из PHP! Кто не знает, что она делает то вот http://www.php.net/manual/ru/function.split.php Я бы и...

Своя реализация метода Split
Написать реализацию метода Split. Не использовать сам метод или какие-либо библиотечные функции при этом. Не могу написать реализацию, не...

Написать программу, сравнивающую быстродействие двух (любых) методов сортировки
Написать программу, сравнивающую быстродействие двух (любых) методов сортировки. Для определения времени выполнения алгоритма используется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru