Typescript 在NGRX选择器的上下文中,如何创建一个选择器,该选择器将返回一组对象,其中您为这些对象提供了一个id列表

Typescript 在NGRX选择器的上下文中,如何创建一个选择器,该选择器将返回一组对象,其中您为这些对象提供了一个id列表,typescript,rxjs,ngrx,Typescript,Rxjs,Ngrx,ngrx从已传递的数组中返回存储状态以外的集合的方式似乎是错误的。我使用的是ngrx实体,大家都知道,实体实际上存储为一个关联数组,带有某种键和一个对象 我编写的选择器如下所示: export const selectSanctuariesState = createFeatureSelector<fromSanctuary.SanctuariesState>('sanctuaries'); export const selectSanctuaryById = (id: strin

ngrx从已传递的数组中返回存储状态以外的集合的方式似乎是错误的。我使用的是ngrx实体,大家都知道,实体实际上存储为一个关联数组,带有某种键和一个对象

我编写的选择器如下所示:

export const selectSanctuariesState = createFeatureSelector<fromSanctuary.SanctuariesState>('sanctuaries');

export const selectSanctuaryById = (id: string) => createSelector(
    selectSanctuariesState,
    sanctuaryState => sanctuaryState.entities[id]
);
注意,我应该能够只使用ID集作为键,就像上面通过哈希或字典中每个对象的键一样。然而,这段代码似乎首先将所有对象放入一个数组,然后过滤数组中具有我要查找的id的对象数组。这似乎是我在放慢整个过程

有更好的方法吗


谢谢

除非你正在处理一个大的集合,否则什么是大的?你不会注意到的。 如果您想进行键查找,我想到的是使用:


您可能会考虑将ID的列表作为选择器道具传递,并且在过滤器谓词中简单地检查项目ID是否在通过Pras.KalExi传递的ID数组中,是的,那将是非常棒的,如何构建该选择器?请检查这一点:长故事短,而不是接收庇护所=避难所。过滤器……,您收到庇护所,props=>sanctuaries.filtersanctuary=>props.ids.someii=>sactionary.id==ii。然后按如下方式订阅:this.store.pipeselectsanctuariesbyid,{ids:[1,2,3]};kalexi,当我直接在entityYep上使用键时,你似乎仍然反对数组过滤,而不是像上面那样,但是我们现在正在重用选择器。关于您的实际问题,我是否正确地理解您不想筛选,而是希望按键检索?如果是这样,您可以将避难所重新制作为地图,并按键检索。但在你这么做之前,我建议你做一个基准和衡量,看看它是否真的会更快。答案取决于sanctuaries数组的大小,以及从中获取的密钥数量。如果避难所的面积小于100个元素,我说不用麻烦了。很可能会变慢。蒂姆德斯克利夫,这看起来不错。因此,在您的代码中,sanctuaries是实体散列,您可以使用sanctuaries[id]语句选择它们,我将尝试一下。。。
export const selectAllSanctuaries = createSelector(
    selectSanctuariesState,
    fromSanctuary.selectAll
);

export const selectSanctuariesById = (ids: string[]) => createSelector(
    selectAllSanctuaries,
    sanctuaries => sanctuaries.filter(sanctuary => ids.some(ii => sanctuary.id === ii))
);
export const selectSanctuariesById = (ids: string[]) => createSelector(
    selectAllSanctuaries,
    sanctuaries => ids.reduce((arr, id) => arr.concat(sanctuaries[id]), []))
);