角度6重置一个数组对象也重置了另一个数组

时间:2018-09-19 20:31:34

标签: angular typescript angular6

我正在使用Angular 6

在我的组件中,有两个数组变量,如

processedItems: Array<any> = [];
totalProductItems: Array<any> = [];

和类似的处理功能

ngOnInit() {
  $products.forEach(async (e) => {
    const res = await this.scraperService.scrapSingle(e.url).toPromise();
    if (res.status.http_code === 200) {
      const properties = this.scraperService.processSingleProduct(res.contents);

      const p_item = {};
      p_item['properties'] = properties;

      this.totalProductItems.push(p_item);

      this._applyFilter();
    }
  }


private _applyFilter() {
  if (!this.filterData) {
    // if nothing to filter, set totalProductItems;
    this.processedItems = this.totalProductItems;
  } else {
    console.log('applying filter');

    // reset processedItems
    this.processedItems.length = 0;

    // this now prints blank array
    console.log(this.totalProductItems);

  }
} 

this.processedItems的length属性设置为0也会清空this.totalProductItems

为什么呢?如何使这些变量分开并独立?

1 个答案:

答案 0 :(得分:1)

here所述:

  

如果将数组分配给变量或将数组传递给函数,则它是对复制或传递的原始数组的引用,而不是数组的值。

因此,在更改本地数组中的length属性时,您实际上也在修改了引用的数组。

某些解决方案:将变量的副本分配给您的变量,这可以通过以下几种方式实现:

  • this.processedItems = [...this.totalProductItems];
  • this.processedItems = this.totalProductItems.concat();
  • this.processedItems = this.totalProductItems.slice(0);

或者不修改length属性,而是重置整个本地数组:

代替this.processedItems.length = 0;,执行:

this.processedItems = [];