有没有办法从 Angular Material 数据源中获取随机前 10% 的结果

Is there a way to get Random Top 10% result from an Angular Material Data Source

对代码的粗略表示歉意。这是一项正在进行的工作。虽然我觉得这离工作很近了,但我似乎无法将其推过终点线。我只是想将 10% 的结果从 http post 请求推送到 material table。任何建议表示赞赏。

RandomSample() {

    const headers = { 'content-type': 'application/json' };

    var userId, roleId, eventTypeIds: any[];
    if (this.selectedUser == undefined) {
      userId = 0;
    }
    else {
      userId = this.selectedUser.id;
    }
    if (this.selectedEventTypes == undefined) {
      eventTypeIds = [-1];
    }
    else {
      eventTypeIds = this.selectedEventTypes.map(selectedEventTypes => selectedEventTypes.id);
    }

    var SearchStart, SearchEnd
    if (this.searchStartDate == undefined) {

      var ssd = new Date();
      ssd.setDate(ssd.getDate() - 14);
      SearchStart = ssd;
    }
    else {
      SearchStart = this.searchStartDate;
    }

    if (this.searchEndDate == undefined) {

      SearchEnd = new Date();
    }

    else {
      SearchEnd = this.searchEndDate;
    }

    var body = JSON.stringify({ UserId: userId, EventTypeIds: eventTypeIds, SearchStartDate: SearchStart, SearchEndDate: SearchEnd });
    console.log(body);
    this.http.post(environment.BASE_URL + 'useractivity/getloginsoverfourteendays', body, { 'headers': headers }).subscribe((selectedUser: any) => {
      var random = Math.floor(Math.random() * selectedUser.length);
      this.dataSource = new MatTableDataSource(selectedUser[random]);
      console.log();
    }, (error: any) => {
      console.error(error);
    })

  }

我们可以根据 this.selectedUser.length 本身使用 slice(startIndex, endIndex) 到 select 范围内的 this.selectedUser[] 项目。这将 select 第一项的 20%。

 selectedUser = Array.from(Array(100).keys()) // [1,2,3,...100]

 function httpCall() {
    const percent = 20;
    const strartIndex = 0;
    const endIndex = (percent * this.selectedUser.length / 100)
    const dataSource = this.selectedUser.slice(strartIndex,Math.floor(endIndex))
    console.log(dataSource)
  }
  
  this.httpCall()

到 select 基于 % 给定的相同数量的项目,但我们随机创建了一个辅助函数,该函数随机 selects 项目和 returns 所选项目数组(避免受骗)。

 selectedUser = Array.from(Array(100).keys()) // [1,2,3,...100]

 function httpCall() {
    const percent = 20;
    const dataSource = this.selectRandomItems(percent, this.selectedUser);
    console.log(dataSource);
  }

 function selectRandomItems(percent, selectedUser) {
    const totalCount = Math.floor((percent * this.selectedUser.length) / 100);
    let returnArr = [];
    while (returnArr.length < totalCount) {
      let item = selectedUser[Math.floor(Math.random() * selectedUser.length)];
      returnArr.push(item);
      returnArr = [...new Set(returnArr)];
    }
    return returnArr;
  }
  
  this.httpCall()