javascript - 如何在不复制数组的情况下创建对现有数组的新引用

标签 javascript angular typescript reference pipe

是否可以在不遍历数组的情况下创建对数组的新引用? 我的问题是我有一个纯 Angular 管,它无法检测推送/弹出更改。我想避免这样的解决方案:

this.array = this.array.filter(e=>true)

这增加了更新引用的复杂性。 我已经尝试了我想到的第一件事,但它不起作用(管道没有检测到任何变化),而且我对 js/ts 不太熟悉,不知道为什么它不起作用。

const newRef = this.array;
this.array = null;
this.array = newRef

我有一个管道,它获取对象数组和过滤器数组并返回过滤对象数组。

@Pipe({
  name: 'eventFilter'
})
export class EventFilterPipe implements PipeTransform {

  transform(events: EventDtos[], filters:Filter[]): any {
     //return filtered events
  }

管道使用:

<div  class="event" *ngFor="let event of events  | eventFilter:filters">
   html stuff
</div>

过滤器推送/弹出过滤器后,不会调用管道的转换,因此我使用此代码强制transform调用:

this.filters = this.filters.filter(e=>true)

但此时我不知道哪种方法更快,是这种方法还是不纯的管道。因此,理想情况下,我想保留纯管道并更新 filters 引用而不增加复杂性

最佳答案

我不建议您使用不纯的管道,它会在每次更改检测时执行并过滤事件,并且每秒可能有数百个更改检测。

你尝试改变引用怎么样,实际上它并没有改变引用,你只是改变了一个包含引用的变量:

const newRef = this.array; // newRef references the array
this.array = null;
this.array = newRef // this.array references the same array, nothing is changed

因此,像您一样复制数组是更好的解决方案,但还有更简单的方法:

this.array = [...this.array];
// or
this.array = this.array.slice();

另一个解决方案是使用 SubjectAsyncPipe 。在这种情况下,不需要复制数组。如果数组很大,或者过滤器经常改变,这可能是首选方式:

@Component({...})
class MyComponent {
    readonly filters$ = new BehaviourValue<Filter>([]);

    ...
    addFilter(filter: Filter): void {
        this.filters$.value.push(filter);
        this.filters$.next(this.filters$.value);
    }
}
<div  class="event" *ngFor="let event of events | eventFilter:(filters$ | async)">
   html stuff
</div>

关于javascript - 如何在不复制数组的情况下创建对现有数组的新引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116398/

相关文章:

javascript - 如何仅使用所需的一组数字生成数字的加法方程式?

angular - 在 Angular 7 中将数据恢复为 react 形式

html - 在 Ionic Angular 项目上的 HTML5 视频标签上播放/暂停

typescript - Vue 过滤器应该如何使用 typescript 进行绑定(bind)?

javascript - d3scale线性更新和缩放冲突

javascript - 使用 Javascript 连接多维数组中的字符串元素

javascript - Angular 2 : how do display character count on reactive form input

javascript - 如何在正则表达式中表达包含命名组的列表?

typescript - takeUntil 带过滤器

javascript - 在 JS 参数中添加引号