-2

最初に長いタイトルで申し訳ありません。

アンダースコアの _.shuffle を解決している最中に、スプライスの使用に遭遇しました。これが私の元のコードです:

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

ただし、テストした後、値だけではなく、[]内の各値が返されることに気付きました。

すなわち

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

この行を変更したとき (splice の 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

私が疑い、コメントで確認したように、あなたはcopiedArray.splice(randomNum,1)[0]ではなくを使用していcopiedArray.splice(randomNum,1[0])ました。

編集:それは元の質問であり、その後編集されました。

そしてsplice、配列(あなたの場合、1つの数字を持つ配列)を返すので、配列の最初の要素を取得すると、まさにあなたが望んでいたことが達成されます.

于 2015-09-23T08:27:37.807 に答える
0

Splice は、削除された要素の配列を返します。追加[0]することで、返された配列の最初の項目を効果的に選択しています。

于 2015-09-23T08:29:51.290 に答える
-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 に答える