Как эффективно заменить значения объектов? - PullRequest
0 голосов
/ 27 мая 2020

Как говорится в названии, есть ли способ сделать приведенное ниже более эффективным? Основная проблема заключается в том, что невозможно предсказать ввод пользователя, однако я открыт для альтернативных способов, если использование будет примерно таким же

import base from "../locale/base.json";
import en from "../locale/en.json";

type Language = keyof typeof languages;

const languages: Record<"en", typeof base> = { en };

export const setLanguage = <T extends Language>(
  lang: T
): ((placholders?: object) => typeof base) => {
  return (placeholders) => {
    let translation = languages[lang];

    for (const [placeholderKey, placeholderValue] of Object.entries(
      placeholders ?? {}
    )) {
      for (const [key, value] of Object.entries(translation)) {
        if (typeof value === "string") {
          translation = {
            ...translation,
            [key]: value.replace(
              new RegExp(`{{${placeholderKey}}}`, "g"),
              placeholderValue
            ),
          };
        }

        if (Array.isArray(value)) {
          translation = {
            ...translation,
            [key]: value.map((val) =>
              val.replace(
                new RegExp(`{{${placeholderKey}}}`, "g"),
                placeholderValue
              )
            ),
          };
        }
      }
    }

    return translation;
  };
};

const x = setLanguage("en");
x().test;
...