我的洗牌计划出了什么问题?

时间:2016-07-21 02:29:55

标签: javascript shuffle

我在下面写了一个改组程序并通过"Will It Shuffle?"运行它。结果似乎表明它在控制台中工作;它正在改变阵列。但该网站向我显示了一个全红色框,让我觉得我的代码出了问题,但我没有看到它。

function shuffle (array) {
    var arr = [],
        length = array.length,
        el;

    while (length > 0) {
      var randomEl = Math.floor(Math.random() * (length - 0) - 0);
      if (length > 1) {
        el = array.splice(randomEl,1);
      } else {
        el = array.splice(0,1);
      }
        arr.push(el[0]);
        length -= 1;
    }

  return arr;
}

3 个答案:

答案 0 :(得分:1)

该页面忽略函数的返回值,因为它需要in-place排序。

如果您在代码末尾添加它,它会按预期工作:

array.push(...arr);

您也可以直接就地执行此操作:

function shuffle (array) {
  var length = array.length;
  while (length) {
    var randomEl = Math.floor(Math.random() * length);
    var el = array.splice(randomEl, 1);
    array.push(el[0]);
    --length;
  }
}

答案 1 :(得分:1)

他们改变了数组,你不改变数组。

您需要更改原始数组,而不是返回新数组。

function shuffle (array) {
    var arr = [],
        length = array.length,
        el;

    while (length > 0) {
      var randomEl = Math.floor(Math.random() * (length - 0) - 0);
      if (length > 1) {
        el = array.splice(randomEl,1);
      } else {
        el = array.splice(0,1);
      }
        arr.push(el[0]);
        length -= 1;
    }

  //replace array with the new items 
  //it is like using concat, but does not produce a new array, 
  //just appends it to the original which has zero items in it.
  Array.prototype.push.apply(array, arr);  



}

答案 2 :(得分:1)

你正在做的是创建一个新的数组,其中包含原始元素。

但是,如果你回过头来看看你传入的数组,你会注意到它没有被洗牌,而是被清空了。显然,这不是“它会洗牌吗?”请你做。

splice()和push()都会改变你调用这些方法的数组。

要回答关于.push(... arr)的问题,javascript中的elipses是使用最新版本EcmaScript 2015推出的功能。它是“传播运算符”。

当您使用“spread”数组调用函数时,就像调用函数一样,将数组的内容作为单独的参数。例如,

array.push(...[1,2,3])

与调用

相同
array.push(1,2,3)

push()可以向数组添加任意数量的逗号分隔参数。因此,在使用循环拼接清空数组参数后,可以使用扩展运算符将新创建的arr的内容推送到空数组。