У меня есть сложный объект JavaScript, такой как:
{
"@context": "http://schema.org",
"@type": "Celebrity",
"name": "Julius Caesar",
"description": "translate:julius.amazing.bio",
"address": {
"@type": "PostalAddress",
"addressLocality": "Roma",
"postalCode": "9999",
"streetAddress": "Coliseum Street 1",
"addressCountry": "IT",
"description": "translate:coliseum.amazing.bio"
}
}
Глубина объекта практически не ограничена. Теперь некоторые поля должны быть переведены. В приведенном выше примере это будет name
и address.description
.
Моя функция перевода имеет следующую подпись:
get(key: string): Observable<string>;
Вывод заключается в том, что он возвращает Наблюдаемое. Цель состоит в том, чтобы перевести поля, начинающиеся с translate:
, и вернуть объект с точно такой же структурой.
Решение, которое я мог бы найти, состоит в том, чтобы forkJoin
все переведенные поля и обновить объект, как только будет сделано.
const obj = {
'@context': 'http://schema.org',
'@type': 'Celebrity',
'name': 'Julius Caesar',
'description': 'translate:julius.amazing.bio',
'address': {
'@type': 'PostalAddress',
'addressLocality': 'Roma',
'postalCode': '9999',
'streetAddress': 'Coliseum Street 1',
'addressCountry': 'IT',
'description': 'translate:coliseum.amazing.bio'
}
};
const cesar$ = this.translate.get('julius.amazing.bio');
const coliseum$ = this.translate.get('coliseum.amazing.bio');
forkJoin([cesar$, coliseum$]).subscribe(res => {
obj.description = res[0];
obj.address.description = res[1];
});
Это не элегантно, не гибко, и код должен быть переписан для каждого объекта, который у меня есть. Любые предложения о том, как сделать это элегантным и многократно используемым способом (с любой глубиной объекта), что позволяет мне переводить любое поле, начинающееся с translate:
?