在角度2中生成没有重复的数组

时间:2017-05-04 12:25:54

标签: arrays angular typescript ionic2

我正在尝试创建一个六个数组,并且它不能包含从1到60的任何重复数字。

我的代码现在是这样的:

//a[not(.//*[not(self::b)]//c)]//c[not(.//*)]

它应该检查数组是否有多于0个元素,如果它有,它将清空它。 如果它是空的,它将组装阵列...... 它不应该重复数字...... 这可以解决我插入重复检查器的问题..:

 jogar(){        
    if(this.random.length != 0){
        this.random=[];
        }else{
            for(var u=0; u<6; u++){
             this.y = Math.ceil(Math.random()*59+1);
                for (var r of this.random){
                    if(r != this.y){
                        this.random.push(this.y); 
                    };  
                };                                                              
            }; 
            this.random.sort(function(a, b){return a-b});
            return this.random; 
        };                                 
};

这家伙让我的代码停止工作。

在搜索之后我读了一些关于Fisher-Yates Shuffle技术的内容,但它似乎对我没用。

我正在使用角度2,使用Ionic 2框架。

这里有人已经提出这个吗?

2 个答案:

答案 0 :(得分:1)

那句话错了,因为

for(var r of this.random)
  if(r != this.y){
    this.random.push(this.y); 
}; 

每次随机数组中的数字与this.y数字不同时,会尝试将this.y数字推送到随机数组。

正如您在此working plunker中所看到的,您可以使用以下代码实现您所需的目标:

import { Component } from '@angular/core';

@Component({...})
export class HomePage {

  random: Array<number> = [];


  public jogar(): Array<number> {        
    if(this.random.length != 0) {
      this.random=[];
    }

    while (this.random.length < 6) { // <- Use while instead of for
      let randomNumber = this.getRandomNumber(); // Get a random number
      if(!this.wasAlreadyAdded(randomNumber)) {
        this.random.push(randomNumber); // Add it if it doesn't exist in the array
      }
    }

    this.random.sort(function(a, b){return a-b});
    return this.random; 

  }  

  private getRandomNumber(): number {
    return Math.ceil(Math.random()*59+1);
  }

  private wasAlreadyAdded(randomNumber: number): number {
    return this.random.indexOf(randomNumber) !== -1;
  }

}

答案 1 :(得分:1)

这是我的代码现在看起来的样子。工作!

jogar(){    
    this.final = [];
    this.numeros = [];  
    for(var i=0;this.final.length<6;i++){
        this.final = this.numberSelect.map(Number).concat(this.numeros);           
        var novoNumero=Math.floor((Math.random()*59)+1);            
        var verificacao=this.confereSeArrayContemItem(this.final,novoNumero);       
        if(verificacao!==1){
            this.numeros.push(novoNumero);                
        }else{
            i--;
        }
        this.final.sort(function(a,b){return a-b});      
    } 
    console.log(this.final.sort(function(a,b){return a-b}));
}

confereSeArrayContemItem(array, item){
    var resultado = 0;
    for(var i=0;i<array.length;i++){
        if(array[i]===item){
            resultado =1;
        }
    }
    return resultado;
}