JSFiddle - React, Tailwind, and code Playground
HTML
<div id="result"></div>
JavaScript
(function () {
setTimeout(function () {
var count = 10000;
var data = '{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.';
v1_count = v2_count = 0;
log('iterations: ', count);
log('data: "' + data + '"');
/*******************************************************/
log('v1');
test(solution_v1, count, data);
log('call count: ', v1_count);
/*******************************************************/
log('v2');
test(solution_v2, count, data);
log('call count: ', v2_count);
/*******************************************************/
}, 1000);
function test(fn, count, data) {
var time = new Date().getTime();
for (var i = count; i--;) {
fn(data);
}
time = new Date().getTime() - time;
log('complete in: ', time, ' ms; everage time: ', time / count);
}
var div = document.getElementById('result');
function log() {
div.innerHTML += '<br>';
for (var i = 0, count = arguments.length; i < count; ++i) {
div.innerHTML += arguments[i];
}
}
var v1_count, v2_count;
function solution_v1(input) {
++v1_count;
var openIndex = input.indexOf('{');
if (openIndex === -1) return [input];
var result = [''];
while (openIndex !== -1) {
var firstPart = input.substring(0, openIndex);
var parts = [];
var openCount = 0;
for (var i = openIndex + 1, length = input.length; i < length; ++i) {
if (input[i] === '{')
++openCount;
else if (input[i] === '}') {
--openCount;
if (openCount < 0) {
parts.push(input.substring(openIndex + 1, i));
input = input.slice(i + 1);
break;
}
}
else if (openCount === 0 && input[i] === '|') {
parts.push(input.substring(openIndex + 1, i));
openIndex = i;
}
}
var newResult = [];
parts.forEach(function (part)...