我正在尝试在Angular6项目中随机化数组的顺序。我不知道该怎么做,最终尝试使用Math.random()
函数对数组进行排序...(不适用于XD)
到目前为止,这是我的代码:
HTML
<div style="background: darkcyan; width: 600px; height: 600px; margin: auto">
<table>
<tr *ngFor="let card of cards">
<div id="{{card.id}}" [ngStyle]="{'background-color': card.color}" style=" width: 100px; height: 125px; margin: 5px"></div>
</tr>
</table>
</div>
<button (click)="shuffle()">Shuffle Cards</button>
TypeScript
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-memory-game',
templateUrl: './memory-game.component.html',
styleUrls: ['./memory-game.component.css']
})
export class MemoryGameComponent implements OnInit {
cards = [];
constructor() { }
ngOnInit() {
this.cards = [
{
'id': 1,
'color': 'red'
},
{
'id': 2,
'color': 'green'
},
{
'id': 3,
'color': 'blue'
},
{
'id': 4,
'color': 'yellow'
}
];
this.shuffle();
}
public shuffle() {
this.cards.sort(Math.random);
}
}
我不知道是否有一个简单的解决方案,但是我真的希望有人能够帮助我。
谢谢
答案 0 :(得分:9)
我认为问题在于您需要执行以下操作:
this.cards.sort((a,b) => 0.5 - Math.random());
based on some previous answers on SE
或执行以下操作:
this.cards.sort(() => Math.random() - 0.5);
基于此SE Query
答案 1 :(得分:0)
尝试此随机播放功能。
function shuffle(arrParam: any[]): any[]{
let arr = arrParam.slice(),
length = arr.length,
temp,
i;
while(length){
i = Math.floor(Math.random() * length--);
temp = arr[length];
arr[length] = arr[i];
arr[i] = temp;
}
return arr;
}
这是一个纯函数,可以在任何数组上使用。 它将创建一个新的改组数组,保留原始数组。
如果要使其在模板中起作用,以便对this.cards
进行排序,则可以使使shuffle()
发生变化的组件方法this.cards
:
public shuffle(): any[]{
let arr = this.cards.slice(),
length = arr.length,
temp,
i;
while(length){
i = Math.floor(Math.random() * length--);
temp = arr[length];
arr[length] = arr[i];
arr[i] = temp;
}
this.cards = arr;
}
编辑:我检查了他在评论中提供的@wannadream链接,看来我上面的shuffle
函数是“事实上的无偏混洗算法是Fisher-Yates(aka Knuth)混洗”。我一定是使用Fisher-Yates改组算法作为参考编写的。
答案 2 :(得分:0)
您可以采取的一种潜在解决方案是创建一个函数以生成一个随机int并将其用于您的Array.prototype.sort
函数回调中:
var cards = [{
'id': 1,
'color': 'red'
},
{
'id': 2,
'color': 'green'
},
{
'id': 3,
'color': 'blue'
},
{
'id': 4,
'color': 'yellow'
}
];
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
cards.sort(function(a, b) {
return getRandomInt(cards.length) - getRandomInt(cards.length);
});
console.log(cards);