.reduce возвращает только один объект вместо массива объектов - PullRequest
0 голосов
/ 03 октября 2019

Я создал свою трубу и сервис. Массив языковых сокращений отправляется в pipe, затем pipe вызывает функции с сайта. Это то, что он передает в качестве параметра pipe = ["be", "bg", "cs", "da", "de", "el", "en"]

это труба

transform(value: any[], kind: string): Observable<string | any>{
        this.customTranslateService.getSortedTranslation(value, kind).subscribe(val => console.log("pipe", val));
        return this.customTranslateService.getSortedTranslation(value, kind);
    }

это мой сервис

getSortedTranslation(value: any[], kind: string): Observable<string | any> {
return this.translateService.get(value.map(lang => `gen.glo.lang.${lang}`))
            .pipe(
                switchMap(result => of(Object.entries(result).sort((a, b) => (a > b) ? 1 : -1).reduce((object, [k, v]) => {
                    object['key']=k.split(".").pop();
                    object['value']=v;
                    return object;
                }, {}))),
            );
}

это возвращаемый объект: {key: "en", value: "English"}

К сожалению, весь код не работает должным образом. Мой сервис возвращает только последний элемент. Таким образом, приложение возвращает ошибку:

LanguageSelectionDialogComponent.html:15 ERROR Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

Если я выполняю console.log в конвейере, оно печатает весь объект по очереди со всеми элементами, к сожалению, только последний из них попадает в pip и html-файл. У меня есть просьба о помощи в поиске причины этой проблемы и пример решения.

1 Ответ

0 голосов
/ 03 октября 2019

Вы имели в виду сделать что-то вроде следующего?

const key = k.split(".").pop();
object[key] = v;
return object;

Это приведет к:

{
en: 'English',
fr: 'French',
...
}

Или, если вы хотите массив объектов, то аккумулятор в Reduce долженбыть массивом:

            .reduce((array, [k, v]) => {
                const object = {};
                object['key']=k.split(".").pop();
                object['value']=v;
                array.push(object)
            }, [])

Что приведет к:

[
{key: 'en', value: 'English'},
{key: 'fr', value: 'French'}
]
...