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

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

16.10.2023, 10:13. Показов 2723. Ответов 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
3992 / 2164 / 833
Регистрация: 13.03.2010
Сообщений: 7,061
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
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru