Как отфильтровать массив объектов, поступающий из хранилища (через селектор)

#angular #redux #state #ngrx #store

#angular #сокращение #состояние #ngrx #Магазин

Вопрос:

Я хочу отфильтровать массив, который поступает из состояния, и вернуть наблюдаемое логическое значение. Это мой селектор

 export const customArray = createSelector(
  arrayCustomizations,
  (entities: Dictionary<Customizations>, props: { id: string }) => {
    const customizations = entities[props.id];
    return customizations.allCustoms;
  },
);
  

Это возвращает массив объектов. Я хочу получить все объекты, у которых есть свойство ‘name’, например object.name !== null и присвоить его этому
buttonDisabled$=
Если я подпишусь на этот селектор, я могу отфильтровать и получить то, что я хочу, но это не наблюдаемое значение.

Ответ №1:

Для этой цели вы можете использовать pipe метод rxjs . Это даст вам наблюдаемое значение.

Используйте вот так.

 export const customArray = createSelector(
  arrayCustomizations,
  (entities: Dictionary<Customizations>, props: { id: string }) => {
    const customizations = entities[props.id];
    return customizations.allCustoms;
  },
).pipe(
  filter(object => object.name !== null)
);
  

Комментарии:

1. Спасибо за ответ, но он возвращает ‘undefined’. Я попробовал это первым,

Ответ №2:

Это эффективно, если манипулировать данными в селекторе. createSelector запоминается и отслеживает изменения значения и не передает значение слушателю, если значение не меняется.

 export const customArray = createSelector(
  arrayCustomizations,
  (entities: Dictionary<Customizations>, props: { id: string }) => {
    const customizations = entities[props.id];
    return customizations.allCustoms.filer(o => o.name != null);
  },
);
  

основываясь на приведенном ниже комментарии, альтернативой может быть

в selector.ts

 export const customArray = createSelector(
  arrayCustomizations,
  (entities: Dictionary<Customizations>, props: { id: string }) => {
    const customizations = entities[props.id];
    return customizations.allCustoms;
  },
);
  

в component.ts

 this.result$ = this.store.pipe(select(customArray, { id: '123' })).pipe(
 map(result => result.filter(a => a.name != null))
)
  

Комментарии:

1. Есть ли какой-либо способ сделать это в компоненте? Потому что этот селектор используется другими. Когда я делаю то же самое в компоненте, я получаю undefined.

2. Пара других вариантов — передайте больше реквизитов, отличных от id, для точной настройки результатов. — передайте результат и используйте оператор фильтра на уровне компонента

3. Проверьте оператор map, затем отфильтруйте результат внутри