Angular - array.push() 刷新页面

Angular - array.push() refreshes page

此函数应将某些数字推送到我将在视图中显示的数组。

@Component({
  selector: 'app-task2',
  templateUrl: './task2.component.html',
  styleUrls: ['./task2.component.css']
})
export class Task2Component implements OnInit {

  array: [number];
  input;

  constructor() {}
  ngOnInit() {}
}

一切正常,但只要我包含 "this.array.push(i)",它就会在提交时不断刷新我的页面(在提交时调用此函数)。我删除它,一切正常,它以正确的方式迭代,找到数字和它应该做的一切。即使我在函数内部创建数组并推送给它,它也能正常工作,但是当我将它用作 class "atribute" 并使用 "this" 作为参考时它不起作用(开始刷新) .

onSubmit() {

  for(var i=2; i<=this.input; i++) {
    if(this.input % i == 0) {
      this.input /= i;
      this.array.push(i);
      return this.onSubmit(); //does same even without this
    }
  }
  this.input = "";
}

在单独的变量中创建新数组,然后一步写入this.array

目前您的问题中只显示了javascript,所以我猜测模板包含的内容。我假设您的代码旨在分解数字?

我怀疑多次刷新的原因是您的模板被编程为在更新时显示 this.array。如果您输入的数字包含很多因数,您会看到多次刷新。

我说的对吗,当您输入质数时,您只会刷新一次,即正确的行为?如果是这样,那么您可以通过对一个单独的变量执行所有 pushing,然后将该单独的变量复制到 this.array 来修复它。例如:

onSubmit() {
  let nextArray = [];
  for(var i=2; i<=this.input; i++) {
    if(this.input % i == 0) {
      this.input /= i;
      nextArray.push(i);
      // Remove this line: return this.onSubmit(); 
    }
  }
  this.array = nextArray;
  this.input = "";
}

您可以通过仅达到 this.input

的平方根来节省迭代次数

当对 N 进行因式分解时,一旦您查看了(包括)sqrt(N),就无需查看 sqrt(N) 和 N 之间的其他数字:它们不能是因数。所以你可以修改循环的第一行。平方比平方根快,因此您可以测试 i*i<=this.input 而不是 i<=Math.sqrt(this.input) 的速度。你只需要记住 push this.input 的最终值,如果它不是 1,因为这将是最大的因素。

onSubmit() {
  let nextArray = [];
  for(var i=2; i*i<=this.input; i++) {
    if(this.input % i == 0) {
      this.input /= i;
      nextArray.push(i);
    }
  }
  if (this.input !==1){
    nextArray.push(this.input);
  }
  this.array = nextArray;
  this.input = "";
}

注意重复因素

我怀疑您当前的代码无法正确分解多次出现相同因子的数字。例如,它只测试一次数字是否可以被 5 整除。因此,如果 this.input 为 250,即 2*5*5*5,它将输出 2、5、25。

为了解决这个问题,如果您还没有找到一个因素,您可以增加i。这样当你找到一个因子时,for的下一个循环将测试相同的因子,随后的循环将继续测试同一个因子,直到它不再是一个因素。

onSubmit() {
  let nextArray = [];
  for(var i=2; i<=this.input;) {
    if(this.input % i == 0) {
      this.input /= i;
      nextArray.push(i);
    } else {
        i++;
    }
  }
  this.array = nextArray;
  this.input = "";
}

我知道这看起来很奇怪,但技巧很简单。

只需初始化数组,重新加载问题就会消失。

array: number[] = [];

我的代码刚刚遇到这个问题,这个技巧解决了这个问题。