Javascript shuffle无法正常工作

时间:2015-07-12 08:08:01

标签: javascript jquery shuffle

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

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的方式如何,它都会被永久改组。

1 个答案:

答案 0 :(得分:4)

在javascript中,将任何内容传递给非基本类型的函数(stringnumberbooleannullundefined和ES6中的新symbol,它会通过引用传递,因此当您更改o中的shuffle时,您还会更改{{1}上的值}}

为防止出现这种情况,您必须从$.data创建一个新的Array,然后更改已创建的$.data,这样就会影响$.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创建的新数组,然后将其随机播放并返回。

由于切片将返回一个新数组,o现在与$.data不同。以下是测试,您可以运行它并查看它记录的内容。

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