Javascript 我的洗牌程序有什么问题?

Javascript 我的洗牌程序有什么问题?,javascript,shuffle,Javascript,Shuffle,我在下面写了一个洗牌程序并运行了一遍。结果显示它在控制台中工作;它正在洗牌阵列。但是这个网站显示了一个红色的框,让我觉得我的代码有问题,但我没有看到 function shuffle (array) { var arr = [], length = array.length, el; while (length > 0) { var randomEl = Math.floor(Math.random() * (length -

我在下面写了一个洗牌程序并运行了一遍。结果显示它在控制台中工作;它正在洗牌阵列。但是这个网站显示了一个红色的框,让我觉得我的代码有问题,但我没有看到

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;
}

该页忽略函数的返回值,因为它需要排序

如果在代码末尾添加此项,则它将按预期工作:

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;
  }
}

该页忽略函数的返回值,因为它需要排序

如果在代码末尾添加此项,则它将按预期工作:

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;
  }
}

他们改变数组,而你不改变数组

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

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);  



}

他们改变数组,而你不改变数组

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

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);  



}

您所做的是创建一个新的数组,并将原始数组中的元素混合在一起

但是,如果返回并查看传入的数组,您会注意到它没有被洗牌,而是被清空。显然,这不是“它会洗牌吗?”要求你做的

splice()和push()都会对调用这些方法的数组进行变异

为了回答您关于.push(…arr)的问题,javascript中的省略号是最新版本EcmaScript 2015附带的一项功能。它是“扩散算子”

当您使用“排列”数组调用函数时,就像使用数组的内容作为单独的参数调用函数一样。比如说,

array.push(...[1,2,3])
和打电话一样

array.push(1,2,3)

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

您所做的是创建一个新数组,并将原始数组的元素混洗

但是,如果返回并查看传入的数组,您会注意到它没有被洗牌,而是被清空。显然,这不是“它会洗牌吗?”要求你做的

splice()和push()都会对调用这些方法的数组进行变异

为了回答您关于.push(…arr)的问题,javascript中的省略号是最新版本EcmaScript 2015附带的一项功能。它是“扩散算子”

当您使用“排列”数组调用函数时,就像使用数组的内容作为单独的参数调用函数一样。比如说,

array.push(...[1,2,3])
和打电话一样

array.push(1,2,3)

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

您在控制台中测试过吗?你经营他们的吗?你回来了,他们不回来。他们改变了数组,你不需要从1到10测试数组,它看起来很随机,我认为问题在于Will it Shuffle站点。@epascarello,是的,很多次。有人说我上一次的分类代码不好,于是把那个网站发给了我。我写了这一个,在那个网站上测试了它,细胞是完全红色的,尽管控制台告诉我它正在洗牌数组。抱歉,JS新手。为什么要检查
length>1
?如果它是1,那么
randomEl
将是0。您是否在控制台中测试了它?你经营他们的吗?你回来了,他们不回来。他们改变了数组,你不需要从1到10测试数组,它看起来很随机,我认为问题在于Will it Shuffle站点。@epascarello,是的,很多次。有人说我上一次的分类代码不好,于是把那个网站发给了我。我写了这一个,在那个网站上测试了它,细胞是完全红色的,尽管控制台告诉我它正在洗牌数组。抱歉,JS新手。为什么要检查
length>1
?如果它是1,那么随机数将是0。我知道你的意思,但这个答案不是很清楚。请详细说明。我知道你的意思,但这个答案不是很清楚。[顺便说一句,我没有投反对票:)]请详细说明。谢谢,@Oriol。我还在学习JS,所以我不熟悉推“…啊”。你能解释一下为什么椭圆也是如此吗?@BeerBeard,这就是答案。例如,如果有
arr=[1,2,3]
,则
array.push(…arr)
的行为类似于
array.push(1,2,3)
。也就是说,它将
arr
的所有元素推送到
array
。我发现其他答案很有帮助,但我非常感谢您的答案,特别是您在spread operator、就地排序和我的另一个就地执行代码变体上提供的源代码。学得好,谢谢。谢谢,@Oriol。我还在学习JS,所以我不熟悉推“…啊”。你能解释一下为什么椭圆也是如此吗?@BeerBeard,这就是答案。例如,如果有
arr=[1,2,3]
,则
array.push(…arr)
的行为类似于
array.push(1,2,3)
。也就是说,它将
arr
的所有元素推送到
array
。我发现其他答案很有帮助,但我非常感谢您的答案,特别是您在spread operator、就地排序和我的另一个就地执行代码变体上提供的源代码。学习好,谢谢。