Javascript 使用月份中的日期对数组进行排序

Javascript sort array using day of month

我想根据日期更改字符串的顺序。

例如,如果单词是“PIZZAS”,5 月 1 日将是“ZZSIPA”,5 月 2 日将是“APIZZS”等...

我 运行 的代码适用于 Math.random(),但是当我为其分配月份中的第几天的值时,它并没有改变。

    const dayOfMonth = new Date().getDate();

function shuffle(s) {
    
  var arr = s.split(''); 

for (let i = arr.length -1; i > 0; i--) {
  let j = Math.floor(dayOfMonth * i)
  let k = arr[i]
  arr[i] = arr[j]
  arr[j] = k
}
    
  s = arr.join(''); 
  return s; // Return shuffled string
    
}
var s = shuffle("PIZZAS");

Math.random() returns a float between 0 and 1, new Date().getDate() returns 一个介于 1 和 31 之间的整数,因此如果您想获得相同的行为,您应该将一个月中的第几天除以 31。

但请注意,这个 pseudo-random 数字生成器不是很好,使用 question about seeding JS random number generator.

中的内容可能会得到不太可预测的结果

通过使用'Math.sin(dayOfMonth++) * 10000',问题解决了。

var dayOfMonth = new Date().getDate();

function random() {
    var x = Math.sin(dayOfMonth++) * 10000;
    return x - Math.floor(x);
}

function shuffle(s) {
    
  var arr = s.split(''); 

for (let i = arr.length -1; i > 0; i--) {
  let j = Math.floor(random() * i)
  let k = arr[i]
  arr[i] = arr[j]
  arr[j] = k
}
    
  s = arr.join(''); 
  return s; // Return shuffled string
    
}
var s = shuffle("PIZZAS");

您的随机播放失败,因为您正在交换未定义的。

我已经调试了你的代码,shuffle(s)函数的实现没有改变。

并且 shuffle_new(s) 将通过使用 modulo operator 解决交换未定义的问题:let j = Math.floor(dayOfMonth * i) % arr.length,因此 arr[j] 永远不会 returns 未定义。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shuffle Demo</title>
</head>

<body>
    <script>
        const writeln = (text = '') => document.writeln(text + '<br/>');
    </script>
    <script>
        const dayOfMonth = new Date().getDate();

        function shuffle(s) {
            var arr = s.split('');
            for (let i = arr.length - 1; i >= 0; i--) {
                writeln();
                let j = Math.floor(dayOfMonth * i)
                writeln('j:' + j);
                let k = arr[i]
                writeln('k:' + k);
                arr[i] = arr[j]
                writeln('arr[j]:' + arr[j]);
                arr[j] = k
                writeln('arr:' + arr);
            }

            s = arr.join('');
            return s; // Return shuffled string

        }

        function shuffle_new(s) {
            var arr = s.split('');
            for (let i = arr.length - 1; i >= 0; i--) {
                writeln();
                let j = Math.floor(dayOfMonth * i) % arr.length
                writeln('j:' + j);
                let k = arr[i]
                writeln('k:' + k);
                arr[i] = arr[j]
                writeln('arr[j]:' + arr[j]);
                arr[j] = k
                writeln('arr:' + arr);
            }

            s = arr.join('');
            return s; // Return shuffled string
        }

        writeln('dayOfMonth:' + dayOfMonth);
        writeln('process: shuffle("PIZZAS")');
        var s = shuffle("PIZZAS");
        writeln('output:' + s);

        writeln();
        writeln();
        writeln();
        writeln();
        writeln('process: shuffle_new("PIZZAS")');
        var s = shuffle_new("PIZZAS");
        writeln('output:' + s);
    </script>
</body>

</html>