У меня есть метод, который возвращает массив объектов
Мне нужно отфильтровать его по определенному критерию, а затем создать новый массив объектов, где данные будут преобразованы в другую модель
а затем вернуть полученный массив, затем подписаться на него
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}, ...]
Я смотрел, но это не совсем мой случай. Я хотел интегрировать Observable в массив, возможно, я делаю это неправильно.
А как насчет простого удаления concatAll
? toArray
должно хватить, если я правильно понимаю ваш случай
он вернет массив моделей [TestModel, TestModel, ...] И работать с ними дальше не очень удобно.
потому что я хотел бы вернуть массив в формате ['key': {key: '1 / t', finish: 7, show: true}, ...]. так что я могу взять html из этого объекта по ключевым значениям
['key': {key: '1 / t', finish: 7, show: true}, ...]
не существует, вы можете делать только это: {'key': {key: '1 / t', finish: 7, show: true}, ...}
. Чтобы помочь вам, не могли бы вы создать stackblitz с фиктивным наблюдаемым getTests ()?
Все, что вам нужно, это метод карты ... взять входящий массив, отфильтровать / преобразовать его и вернуть. Rxjs - это не lodash.
поскольку поступает массив, вы, вероятно, получите что-то вроде map (tests => {tests.filter (test =>! test.isDone) .map (test => {...})}). Я считаю, что это не очень красиво и есть более нормальный способ
Что такое TestModel
? Вероятно, это не Observable, поэтому concatAll
выдает ошибку при попытке подписаться на него.
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)),
);
}
Вы можете сослаться на ответы на подобные вопросы здесь - stackoverflow.com/questions/43549223/…stackoverflow.com/questions/44633266/…