2017-03-23 12 views
0

配列をシャッフルして新しい配列を返す方法を知りたい。これまでのところ、私はスタックオーバーフローで、このソリューションを見てきました:配列をシャッフルしてJSで新しい配列を返す

How to randomize (shuffle) a JavaScript array?

このソリューションは、シャッフル同じ配列を返すには完璧に動作しますが、私は本当に理由を理解していません。誰もがこれを説明し、それが新しい配列を返すように私がそれを修正するのを助けることができますか?

ありがとうございます!

+0

ためたぶん便利なあなたはそれがあなたの元の配列を変更したが、単に新しいもの(コピー)を返さないようにしたいですか? – ramden

+0

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – Bergi

答えて

1

配列のコピーを作成するために、私の知っている最も簡単な方法は、使用している:

var newArray = [].concat(originalArray); 

をあなたがリンクされ答えにソリューションのほとんどの1行目にこれを行うことができ、あなたが取得されます元のままの新しいアレイバック。ここにリンクされ、質問のトップクラスの答えを修正したバージョンです:あなたがサードパーティのライブラリを使用したい場合は

function shuffle(originalArray) { 
    var array = [].concat(originalArray); 
    var currentIndex = array.length, temporaryValue, randomIndex; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

    // Pick a remaining element... 
    randomIndex = Math.floor(Math.random() * currentIndex); 
    currentIndex -= 1; 

    // And swap it with the current element. 
    temporaryValue = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = temporaryValue; 
    } 

    return array; 
} 
+1

[JavaScriptで配列をクローン](https://davidwalsh.name/javascript-clone-array)を読むと、 var array = originalArray.slice(0); ' – Ouroborus

+0

@Ouroborusはい、それは配列を複製する別の方法です。彼が提案したように、 'Array'プロトタイプを修正する必要はないと思います。また、 'concat'は' slice'よりもはるかに高速です:https://jsperf.com/test-slice-vs-concat/1 –

+0

実際には、ChromeではSafariのほうがはるかに速く、Firefoxとほぼ同じですスライスはかなり高速です。ああブラウザ:... P –

0

は、Lodashは、このために非常に良いです。

_.shuffle()を使用して新しい配列を取得してください。

+0

この回答は何も説明していません。 – Bergi

0

あなた

<p id="output"> 

<script> 
var arrayList= ['a','b','c','d','e','f','g']; 
arrayList.sort(function(){ 
    return 0.5 - Math.random() 
}) 

document.getElementById("output").innerHTML = arrayList; 

</script> 
関連する問題