在javascript中用句子中的单词洗牌(编码恐怖 - 如何改进?)

时间:2010-04-27 19:46:59

标签: javascript shuffle

我正在尝试做一些相当简单的事情,但我的代码看起来很糟糕,我确信有更好的方法可以在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);      

}

你能帮我简化一下吗?

5 个答案:

答案 0 :(得分:11)

几乎类似于python代码:

var s = 'This is a sentence'
var shuffledSentence = s.split(' ').shuffle().join(' ');

为了使上述工作正常,我们需要向Array添加一个shuffle方法(使用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;
};

答案 1 :(得分:1)

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(''))

答案 2 :(得分:0)

此代码未经测试,但它是另一种方法的粗略概念:

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

答案 3 :(得分:0)

这是一个非常古老的问题,但仍然有用 使用array.sort()

这是一种非常简单的方法

&#13;
&#13;
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(' '))
&#13;
&#13;
&#13;

答案 4 :(得分:0)

使用排序方法和数学方法:

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"]