如何改组JavaScript数组?

时间:2018-10-30 14:36:23

标签: javascript arrays angular random shuffle

我正在尝试在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);
  }
}

我不知道是否有一个简单的解决方案,但是我真的希望有人能够帮助我。

谢谢

3 个答案:

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