缺少数据的填充数组

时间:2019-11-29 17:07:32

标签: javascript

我有一组N个数组,它们以不同的频率更新(将数据推入其中)。如果我的数组更新频率比“最快”数组慢,那么这些慢速数组应该用先前的数据填充。

示例:2个数组,以不同的频率更新,超过10秒看起来像

<mat-card class="login-card">
    <div>
        <mat-card-title class="text-center" i18n="@@MoVeSeLo_H1_1">
            Please Sign In
        </mat-card-title>
        <form [formGroup]="_siteForm">            
            <mat-form-field class="right">
                <mat-select (selectionChange)="doSomething($event)" placeholder="Language">
                    <mat-option *ngFor="let language of languages" [value]="language">
                        {{language.viewValue}}
                    </mat-option>
                </mat-select>
            </mat-form-field>
       </form>
    </div>
</mat-card>

我希望像这样填充较慢的数组

.login-card {
    width: 80%;
    max-width: 80rem; }

.mat-form-field {
    display: block;
    width: 100%;
    margin: 0 auto;
    max-width: 30rem; }

.right {
    float: right;
    width: 200px;
}

并且阵列长度应始终相等。

我为此编写了一个完整的可测试设置,只是无法找出可以正确填充的神奇公式。请看一下小提琴,以找到解决此问题的简便方法!看一下函数“处理器”

HTML

// fast array updates every 1 second
// after 10 seconds the data is:
let fast_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// slow array updates every 5 seconds
// after 10 seconds the data is:
let slow_array = [0, 1];

JS

fast_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
slow_array = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

https://jsfiddle.net/79wbnkf8/1/

2 个答案:

答案 0 :(得分:1)

从功能列表中找到最常使用的功能

let mostFreqFeature = features.reduce((min, feature) => min.freq < feature.freq ? min : feature);

设置start函数中最常用功能的间隔

pushItem_interval = setInterval(() => {
    pushItem();
  }, mostFreqFeature.freq * 1000)

最后将项目推入您的列表

function pushItem(){
 for(var i=0;i<features.length;i++){
  let feature = features[i];
    if(feature.freq==mostFreqFeature.freq)
      feature.raw_data.push(getRandomInt())
      else{
        if(feature.raw_data.length<=0){
         feature.raw_data.push(getRandomInt());
         return;
        }
        if((feature.raw_data.length)% feature.freq==0)
            feature.raw_data.push(getRandomInt())
            else{
            let lastItem = feature.raw_data[feature.raw_data.length-1];
             feature.raw_data.push(lastItem)
            }

      }    
 }
}

工作示例jsfiddle

希望,它将对您的需求有所帮助。

答案 1 :(得分:1)

您可以添加功能:

function lcm(x, y) {
  return (!x || !y) ? 0 : Math.abs((x * y) / gcd(x, y));
}

function gcd(x, y) {
  x = Math.abs(x);
  y = Math.abs(y);
  while(y) {
    var t = y;
    y = x % y;
    x = t;
  }
  return x;
}

,然后按如下所示修改您的过程功能:

function processor(feature) {
  // determine highest frequency
  let most_frequent = Math.min(feature1.freq, feature2.freq);
  // determine longest length
  let longest_length = Math.max(feature1.raw_data.length, feature2.raw_data.length);

  let l = lcm(feature1.freq, feature2.freq);
  let max_filler = l / feature1.freq;

  // process data if needed
  feature.final_data = [];
  for (let i = 0; i < feature.raw_data.length; i++) {

    if(feature.freq !== most_frequent){
        //let max_filler =  0; //???
        for(let x = 0; x < max_filler; x++){
        feature.final_data.push(feature.raw_data[i]);
        if (feature.final_data.length >=longest_length) break;
      }
    } else {
      feature.final_data.push(feature.raw_data[i]);
    }
  }
}