【问题标题】:Shuffle an Array and Return a New One in JS在 JS 中打乱一个数组并返回一个新数组
【发布时间】:2017-08-15 08:46:40
【问题描述】:

我想知道如何打乱一个数组并返回一个新数组。到目前为止,我已经在 Stack Overflow 中看到了这个解决方案:

How to randomize (shuffle) a JavaScript array?

这个解决方案在返回相同的随机数组时效果很好,但我真的不明白为什么。谁能解释一下并帮我修改它以返回一个新数组?

谢谢!

【问题讨论】:

标签: javascript arrays random shuffle


【解决方案1】:

我所知道的创建数组副本的最简单方法是使用:

var newArray = [].concat(originalArray);

您可以在链接答案的大多数解决方案的第一行中执行此操作,您将获得一个新数组,原始数组保持不变。以下是链接问题上评分最高的答案的修改版本:

function shuffle(originalArray) {
  var array = [].concat(originalArray);
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

【讨论】:

  • Clone Arrays with JavaScript 建议var array = originalArray.slice(0);
  • @Ouroborus 是的,这是克隆阵列的另一种方式。不过,我认为您不应该修改 Array 原型,正如他所建议的那样。此外,concat 似乎比 slice 快得多:jsperf.com/test-slice-vs-concat/1
  • 实际上,它只是在 Chrome 中明显更快,在 Safari 中它们大致相同,而 Firefox slice 明显更快。哦浏览器...:P
  • 非常感谢罗伯!这看起来很简单,所以我想我只是让它变得更复杂。再次感谢!
【解决方案2】:

也许对你有用

var original = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var copy = [].concat(original);
copy.sort(function(){
  return 0.5 - Math.random();
});
console.log(copy);

【讨论】:

    【解决方案3】:

    如果你想使用 3rd 方库,Lodash 非常适合。

    只需使用_.shuffle(),即可获取新数组。

    【讨论】:

    • 这个答案没有任何解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2012-02-22
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多