我想知道如何只对函数中的字母进行排序

时间:2017-11-29 19:42:15

标签: javascript regex sorting split

如何使用纯javascript对一组字母进行排序,就像我在下面写的那样。 你使用.match [a-zA-Z]吗? 或拆分?或者是其他东西 ?? 例如:

   sortGroupsOfLetters('x5*RnEM*BLL8nX@3');
   // Result should be something like: BLL5*RnEM*nX8x@3
   // Only the letters should be randomly sorted

这是我到目前为止所拥有的。它不断吐出随机字母而没有像“ RnEM BLLxnX @”这样的数字

 function randomsort(a, b) { 
return Math.random()>.5 ? -1 : 1;
}
 var arrStr = 'x5*RnEM*BLL8nX@3';
 var res = arrStr.split(/[0-9]/gi).sort(randomsort,/[0-9]/gi); 
var randomStr = arrStr.split(/[0-9]/gi).sort(randomsort,/[0-9]/gi); 
 console.log(randomStr.join('')); // returns something like *RnEM*BLLxnX@" 

我还创建了一个函数,用于保存数字和符号,并用字符串中的第一个字母替换字母(x5 * xxxx * xxx8xx @ 3)。

 function myFunction() {
  var arrStr = "x5*RnEM*BLL8nX@3"; 
  var letters = arrStr.split(/[0-9]/gi).sort(randomsort,/[0-9]/gi); 

  var res = arrStr.replace(/[a-z]/gi, letters[0]);

 document.getElementById("demo").innerHTML = res  //displays something like x5*xxxx*xxx8xx@3
 }

1 个答案:

答案 0 :(得分:1)

我确定还有其他(更好)的方法,但这是一个解决方案。

首先,将字母组和非字母组分成两个不同的数组。然后你以任何你想要的方式洗牌。然后,将重新组合的字母组数组与其他数组重新组合。

在下面的示例中,我使用String#match创建两个数组,将其中一个,然后Array#mapArray#join重新组合在一起。



let str = 'x5*RnEM*BLL8nX@3'

// Get an array of letter groups
let a = str.match(/[a-z]+/gi)
// Get array of everything else in the string
let b = str.match(/[^a-z]+/gi)

// Shuffle the letter groups randomly
var j, x, i;
for (i = a.length - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    x = a[i];
    a[i] = a[j];
    a[j] = x;
}

// Recombine the two arrays
let newstr = a.map((s,i)=>{return s + (b[i] || "")}).join("")

console.log(newstr)