Замена плейсхолдеров

Benchmark created on


Setup

// код для генерации данных
const alph = 'qwertyuiop[]asdfghjkl;\'\\zxcvbnm,./QWERTYUIOPASDFGHJKLZXCVBNM"<>';
const getRandomStr = (length) => Array(length)
  .fill(null)
  .reduce((acc) => acc + alph[Math.floor(Math.random()*alph.length)], '')
  // создаём новую строку в памяти для более честной работы
  .replace('$', '');
const getRandomSubstr = (str, length) => {
  const start = Math.floor(Math.random()*(str.length - length));
  return str
    .substring(start, start + length)
    // создаём новую строку в памяти для более честной работы
    .replace('$', '');
}

//данные
const bigStr = getRandomStr(1<<20);
const replaceArr = Array(10).fill(0).map(() => [getRandomSubstr(bigStr, 50), getRandomStr(1<<20)]);


// реализации
const replaceByArr = (str, arr) => {
  const indexes = arr
    // ищем места для замены через indexOf
    .map(([placeholder, content]) => {
      const start = str.indexOf(placeholder);
      if (start === -1) {
        return null;
      }
      return {
        start,
        end: start + placeholder.length,
        content,
      };
    })
    .filter(item => item !== null)
    // сортируем их в порядке вхождения в строку
    .sort((a, b) => a.start - b.start);

  // если ничего не нашли, возвращаем исходную строку
  if (!indexes.length) {
    return str;
  }

  return indexes.reduce((acc, {start, end, content}, i, arr) => {
    const next = arr[i + 1];
    // текс находящийся между текущим плейсхолдером и следующим
    const tailPart = str.substring(end, next ? next.start : undefined);
    return acc + content + tailPart;
  }, str.substring(0, indexes[0].start))
}

const simpleReplaceByArr = (str, arr) => arr.reduce((acc, [placeholder, content]) => str.replace(placeholder, content), str);

Test runner

Ready to run.

Testing in
TestOps/sec
indexOf + reduce + substring
replaceByArr(bigStr, replaceArr).length
ready
recude + replace
simpleReplaceByArr(bigStr, replaceArr).length
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.