Один из вариантов - создать массив случайных символов (без пробелов), а затем вызвать replace
в исходной строке с помощью регулярного выражения, которое заменяет непробельные символы на элементы в массиве с соответствующим индексом, увеличиваяиндекс в процессе:
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
String.prototype.shuffle = function () {
// pass to shuffleArray an array of all non-whitespace characters:
const randomChars = shuffleArray([...this.replace(/\s+/g, '')]);
let index = 0;
// `\S` matches any non-whitespace character:
return this.replace(/\S/g, () => randomChars[index++]);
}
console.log(
`What is the difference in between 'Apache Environment', 'Environment' and 'PHP Variables'?`
.shuffle()
);
Также обратите внимание, что изменение таких встроенных объектов, как String.prototype
, обычно считается довольно плохой практикой и может привести к поломке;если вы не заполняете что-то официально, лучше использовать отдельную функцию:
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
function shuffle(str) {
const randomChars = shuffleArray([...str.replace(/\s+/g, '')]);
let index = 0;
return str.replace(/\S/g, () => randomChars[index++]);
}
console.log(shuffle(
`What is the difference in between 'Apache Environment', 'Environment' and 'PHP Variables'?`
));