-2

首先抱歉标题太长,我真的不知道如何更好地表达它。

在解决下划线中的_.shuffle的过程中,遇到了splice的使用。这是我的原始代码:

shuffle = function(array) {
  var shuffledArray = [];
  var total = array.length;
  var copiedArray = array.slice();
  while (total){
    var randomNum = Math.floor(Math.random() * total);
    shuffledArray.push(copiedArray.splice(randomNum,1));
    total--;
  }
  return shuffledArray;
};
var originArray = [1, 2, 3, 4];
console.log(shuffle(originArray));

然而,在测试之后,我意识到它将返回 [] 内的每个值,而不仅仅是值。

IE

[ [ 4 ], [ 3 ], [ 1 ], [ 2 ] ]
//instead of [ 4, 3, 1, 2]

当我更改此行时(在拼接中的 deleteCount 后添加了“[0]”)

shuffledArray.push(copiedArray.splice(randomNum,1));

进入这个

//edited
shuffledArray.push(copiedArray.splice(randomNum,1)[0]);

我得到的返回数组就是我想要的,也就是

[ 3, 1, 2, 4 ] //values are not in [ ]

有人可以解释在 splice() 之后添加 [0] 如何使值不返回 [ ] 或者为什么没有 [0] 吗?

4

4 回答 4

1

splice返回一个数组。当你将一个数组推入一个数组时,你会得到一个数组数组。通过添加[0],您可以推送数组的第一个元素。这不是 Javascript 的怪异之处——这是完全合理的。

于 2015-09-23T08:27:36.030 回答
0

Splice 返回已删除元素的数组。通过添加[0],您可以有效地选择返回数组中的第一项。

于 2015-09-23T08:29:51.290 回答
0

正如我怀疑并在评论中确认的那样,您使用的是copiedArray.splice(randomNum,1)[0],而不是copiedArray.splice(randomNum,1[0]).

编辑:这是最初的问题,后来被编辑了。

并且由于splice返回一个数组(在您的情况下是一个带有一个数字的数组),因此采用数组的第一个元素可以完全实现您想要的。

于 2015-09-23T08:27:37.807 回答
-2

尽量不要重新发明轮子! http://php.net/manual/fr/function.shuffle.php

如果你真的想,试试这个:

  while (total){
    var randomNum = Math.floor(Math.random() * total);
    ShuffledArray[] = array[randomNum]; //add an item to next pos
    unset(array[randomNum]); //remove the item added
    array = array_values(array); //reindex array
    total--;
  }

祝你好运!

于 2015-09-23T08:25:53.720 回答