【问题标题】:Javascript shuffle is not working as its supposed toJavascript shuffle 无法正常工作
【发布时间】:2015-07-12 08:08:01
【问题描述】:

这是我正在使用的随机播放功能:

function shuffle(o,l){
      for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;

}

我在这段代码中使用它来打乱一个变量,但不知何故它打乱了两个变量?

 function generate() {
    if (a = 1) {
    var shuffled = $.data;
     shuffle(shuffled,500);
    } else if (a = 2) {
 for (var i = 0; i < 500; i++) {
        console.log($.data[i]);
     }}
 }

它打乱了'shuffled'变量,但不知何故也打乱了$.data,因此无论if采用哪种方式,它都会永久打乱。

【问题讨论】:

  • Array 是通过引用传递的,因此您必须创建一个新数组,例如使用 o =o.slice() 来获得一个不会影响 $.data 的数组。
  • 你的意思是这样的? var shuffle = new Array();洗牌 = $.data;如果是这样,那也不行。
  • 我现在明白了你的意思,实际上确实有效。谢谢。
  • 如果您认为这确实解决了问题,您应该接受答案,因此任何有相同问题的人都知道答案确实可以解决问题。

标签: javascript jquery shuffle


【解决方案1】:

在 javascript 中,当您将任何内容传递给非原始类型的函数(stringnumberbooleannullundefined 和 ES6 中的新 symbol)时,它'将通过引用传递,因此当您更改 shuffle 中的 o 时,您也会更改 $.data 上的值。

为防止这种情况,您必须从$.data 创建一个新的Array,然后更改创建的$.data 中的值。

在你的函数中,你只需要改变

for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);

for(var j, x, i = l, o = o.slice(); i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);

我们将 o 分配给从输入的 o 创建的新数组,然后将其随机化并返回。

由于 slice 将返回一个新数组,o 现在不同于 $.data。下面是测试,你可以运行它看看它记录了什么。

var a = [1, 2, 3, 4 ,5, 6, 7, 8, 9 , 10];
var b = [1, 2, 3, 4 ,5, 6, 7, 8, 9 , 10];

var len = 10;

// Origin, it return the same array that it accept.
function shuffle(o,l) {
      for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
}


// Altered, it'll return a new array.
function shuffleAlt(o,l) {
      for(var j, x, i = l, o = o.slice(); i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
}

var c = shuffle(a, len);
console.log(a);
console.log(c);
console.log("c === a :" , c === a);
var d = shuffleAlt(b, len);
console.log(b);
console.log(d);
console.log("d === b :" , d=== b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多