Перемешивание слов в предложении в javascript (код ужаса - как улучшить?)
Я пытаюсь сделать что-то довольно простое, но мой код выглядит ужасно, и я уверен, что есть лучший способ сделать что-то в javascript. Я новичок в JavaScript, и пытаюсь улучшить свое кодирование. Это просто кажется очень грязным.
Все, что я хочу сделать, это случайным образом изменить порядок некоторых слов на веб-странице. В Python код будет выглядеть примерно так:
s = 'THis is a sentence'
shuffledSentence = random.shuffle(s.split(' ')).join(' ')
Тем не менее, это чудовище, которое мне удалось создать в javascript
//need custom sorting function because javascript doesn't have shuffle?
function mySort(a,b) {
return a.sortValue - b.sortValue;
}
function scrambleWords() {
var content = $.trim($(this).contents().text());
splitContent = content.split(' ');
//need to create a temporary array of objects to make sorting easier
var tempArray = new Array(splitContent.length);
for (var i = 0; i < splitContent.length; i++) {
//create an object that can be assigned a random number for sorting
var tmpObj = new Object();
tmpObj.sortValue = Math.random();
tmpObj.string = splitContent[i];
tempArray[i] = tmpObj;
}
tempArray.sort(mySort);
//copy the strings back to the original array
for (i = 0; i < splitContent.length; i++) {
splitContent[i] = tempArray[i].string;
}
content = splitContent.join(' ');
//the result
$(this).text(content);
}
Можете ли вы помочь мне упростить вещи?
4 ответа
Почти похож на код Python:
var s = 'This is a sentence'
var shuffledSentence = s.split(' ').shuffle().join(' ');
Чтобы вышесказанное сработало, нам нужно добавить метод shuffle в Array (используя Fisher-Yates).
Array.prototype.shuffle = function() {
var i = this.length;
if (i == 0) return this;
while (--i) {
var j = Math.floor(Math.random() * (i + 1 ));
var a = this[i];
var b = this[j];
this[i] = b;
this[j] = a;
}
return this;
};
Это очень старый вопрос, но все еще может быть полезным.
Вот очень простой способ сделать это, используя array.sort()
const s = 'This is very old question but can still be useful.';
console.log(s.split(' ').sort(() => Math.floor(Math.random() * Math.floor(3)) - 1).join(' '))
String.prototype.shuffler=function(delim){
delim=delim || '';
return this.split(delim).sort(function(){
return .5-Math.random()}).join(delim);
}
// чтобы перемешать слова, пропустить пробел
var s='abc def ghi jkl mno pqr stu vwx yz' alert(s.shuffler(' '))
Этот код не проверен, но это грубая идея альтернативного подхода:
function scrambleWords(text) {
var words = text.split(' ');
var result = "";
while(words.length > 0) {
if(result.length > 0) { words += " "; }
words += words.splice(Math.abs(Math.random() * (words.length - 1)), 1);
}
return result;
}
По сути, идея состоит в том, чтобы случайно разделить слова из оригинального текста и восстановить строку.
ПРИМЕЧАНИЕ: сплайс немного медленный (перестраивает массив), поэтому, если производительность имеет значение, я бы не предложил это как оптимальный, но я думаю, что код проще.
ОБНОВЛЕНИЕ: мне больше нравится случайный ответ, который был только что опубликован как лучшее решение:D
Используя метод сортировки и математический метод:
var arr = ["HORSE", "TIGER", "DOG", "CAT"];
function shuffleArray(arr){
return arr.sort( () => Math.floor(Math.random() * Math.floor(3)) - 1)
}
// every time it gives random sequence
shuffleArr(arr);
// ["DOG", "CAT", "TIGER", "HORSE"]
// ["HORSE", "TIGER", "CAT", "DOG"]
// ["TIGER", "HORSE", "CAT", "DOG"]