Concat Observable

У меня есть метод, который возвращает массив объектов

Мне нужно отфильтровать его по определенному критерию, а затем создать новый массив объектов, где данные будут преобразованы в другую модель

а затем вернуть полученный массив, затем подписаться на него

public getTestWithPare(): Observable<Array<TestModel>> {

    return this.http.getTests().pipe(
        flatMap(rate => rate), // splitting array
        filter(test => !test.isDone),
        map(test => {

            const testPare = new TestModel();
            testPare.key = `${test.id}/${test.name}`;
            if (test.type === 'new') {
                testPare.finish = test.value;
                testPare.show = true;
            } else {
                testPare.start = test.value;
                testPare.hide = true;
            }

            return testPare;
        }),
        concatAll(),
        toArray()
    );
}

после вызова метода выдает ошибку:

You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

Я не могу понять что не так

Я хочу получить на выходе массив объектов

примерно в таком формате: ['key': {key: '1 / t', finish: 7, show: true}, ...]

Вы можете сослаться на ответы на подобные вопросы здесь - stackoverflow.com/questions/43549223/…stackoverflow.com/questions/44633266/…

Tushar Walzade 18.12.2018 08:33

Я смотрел, но это не совсем мой случай. Я хотел интегрировать Observable в массив, возможно, я делаю это неправильно.

cat1244 18.12.2018 08:39

А как насчет простого удаления concatAll? toArray должно хватить, если я правильно понимаю ваш случай

Picci 18.12.2018 08:47

он вернет массив моделей [TestModel, TestModel, ...] И работать с ними дальше не очень удобно.

cat1244 18.12.2018 08:59

потому что я хотел бы вернуть массив в формате ['key': {key: '1 / t', finish: 7, show: true}, ...]. так что я могу взять html из этого объекта по ключевым значениям

cat1244 18.12.2018 09:01
['key': {key: '1 / t', finish: 7, show: true}, ...] не существует, вы можете делать только это: {'key': {key: '1 / t', finish: 7, show: true}, ...}. Чтобы помочь вам, не могли бы вы создать stackblitz с фиктивным наблюдаемым getTests ()?
Yanis-git 18.12.2018 09:06

Все, что вам нужно, это метод карты ... взять входящий массив, отфильтровать / преобразовать его и вернуть. Rxjs - это не lodash.

Davy 18.12.2018 09:09

поскольку поступает массив, вы, вероятно, получите что-то вроде map (tests => {tests.filter (test =>! test.isDone) .map (test => {...})}). Я считаю, что это не очень красиво и есть более нормальный способ

cat1244 18.12.2018 09:17

Что такое TestModel ? Вероятно, это не Observable, поэтому concatAll выдает ошибку при попытке подписаться на него.

martin 18.12.2018 12:01
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
9
107
1

Ответы 1

Rxjs здесь излишний (только если у вас большие массивы и вы не хотите обрабатывать его за один раз), методы пользовательского массива

const testToTestPare = test => {
  /* If you don't need TestMode, create an empty object const testPare = {} */
  const testPare = new TestModel(); 
  testPare.key = `${test.id}/${test.name}`;
  if (test.type === 'new') {
    testPare.finish = test.value;
    testPare.show = true;
  } else {
    testPare.start = test.value;
    testPare.hide = true;
  }
  return testPare;
};


public getTestWithPare(): Observable<Array<TestModel>> {
    return this.http.getTests().pipe(
        map(tests => tests.map(testToTestPare)),
    );
}

Другие вопросы по теме