【问题标题】:How this piece of code can be improved or optimized [closed]如何改进或优化这段代码[关闭]
【发布时间】:2019-08-02 21:17:48
【问题描述】:

如何改进或优化此代码。虽然它给出了所需的结果。我想用更好的方法来写它。

我正在从 www.contentful.com 获取数据,然后对其进行过滤以使用其密钥进行本地化。注意我们必须使用 .reduce() 函数这是一个要求

   import * as fs from 'fs';
   const client = createClient();
   interface IEntry {
     id: string;
     text: string;
   }
   interface IEntries {
     [key: string]: { [key: string]: string };
   }

   export async function getLocalization() {
     const entries = await client.getEntries<IEntry>({
       skip: 0,
       limit: 100,
       locale: '*',
       content_type: 'translation',
     });

     let enEntries: IEntries = entries.items
       .map((e: any) => e.fields)
       .reduce(
         (ret, entry) => ({
           ...ret,
           [entry.id.fi]: entry.text.en,
         }),
       {},
       );

     let fiEntries: IEntries = entries.items
       .map((e: any) => e.fields)
       .reduce(
         (ret, entry) => ({
           ...ret,
           [entry.id.fi]: entry.text.fi,
         }),
         {},
          );

  let svEntries: IEntries = entries.items
    .map((e: any) => e.fields)
    .reduce(
      (ret, entry) => ({
        ...ret,
        [entry.id.fi]: entry.text.sv,
      }),
      {},
    );

  const translations = {
    ['en']: { ...enEntries },
    ['fi']: { ...fiEntries },
    ['sv']: { ...svEntries },
  };

  const dir = './data';
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
  }
  fs.writeFileSync('data/translations.json', JSON.stringify(translations));
  return true;
}
getLocalization();

Output can be found on this link (actual values have been removed): https://imgur.com/k3rzxWx

【问题讨论】:

  • 这看起来像是属于Code Review
  • 示例输出 JSON 可以在以下链接中找到:imgur.com/k3rzxWx
  • 哦,我从来不知道有这样的事情:D 感谢您通知我。

标签: javascript typescript logic


【解决方案1】:

您的代码看起来不错,但是您可以添加一个帮助程序来保存重复:

 // Can be replaced with Object.fromEntries(values.map(getDescriptor)) soon
 function mapOf<E, V>(values: Array<E>, getDescriptor: (entry: E) => [string, V]): { [key: string]: V } {
   const result = {};
   for(const entry of values) {
     const [key, value] = getDescriptor(entry);
     result[key] = value;
   }
   return result;
 }


 const translations = {
   en: mapOf(entries.items, it => ([it.fields.id.fi, it.fields.text.en])),
   fi: mapOf(entries.items, it => ([it.fields.id.fi, it.fields.text.fi])),
   sv: mapOf(entries.items, it => ([it.fields.id.fi, it.fields.text.sv])),
 };

或者作为另一种方法,您可以在迭代条目时自动填充您的翻译对象:

  const translations = { en: {}, fi: {}, sv: {}, };

  for(const it of entries.items) {
     const key = it.fields.id.fi, values = it.fields.text;
     for(const language in values) {  
       if(!translations[language]) continue;
       translations[language][key] = values[language];
     }
  }

【讨论】:

  • const localizations = entries.items /* tslint:disable */ .map((e: any) =&gt; e.fields) .reduce( (ret, entry) =&gt; { ret.en[entry.id.fi] = entry.text.en === undefined ? 'no_value_found' : entry.text.en; ret.fi[entry.id.fi] = entry.text.fi === undefined ? 'no_value_found' : entry.text.fi; ret.sv[entry.id.fi] = entry.text.sv === undefined ? 'no_value_found' : entry.text.sv; return ret; }, { en: {}, fi: {}, sv: {} }, );
  • @jonas 您对此有何看法?我怎样才能摆脱这个任何你有什么想法
  • 我个人不喜欢这种减少模式,但这是个人喜好。您的 IEntries 类型与您使用的类型不匹配,您应该使该类型与实际结构匹配。
  • 是的,你是对的,类型有问题
【解决方案2】:

我认为在这种情况下以下方法是最好的。

import { IFields, ITranslation } from './localization.types';
import * as fs from 'fs';
const client = createClient();

const en: ITranslation = {};
const fi: ITranslation = {};
const sv: ITranslation = {};

export async function getLocalization() {
  const entries = await client.getEntries<IFields>({
    skip: 0,
    limit: 100,
    locale: '*',
    content_type: 'translation',
  });
  const localizations = entries.items
    .map(e => e.fields)
    .reduce(
      (ret, entry) => {
        ret.en[entry.id.fi] = entry.text.en === undefined ? 'no_value_found' : entry.text.en;
        ret.fi[entry.id.fi] = entry.text.fi === undefined ? 'no_value_found' : entry.text.fi;
        ret.sv[entry.id.fi] = entry.text.sv === undefined ? 'no_value_found' : entry.text.sv;
        return ret;
      },
      { en, fi, sv },
    );
  const dir = './data';
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
  }
  fs.writeFileSync('data/translations.json', JSON.stringify(localizations));
  return true;
}
getLocalization();

以下是类型

export interface IId {
  fi: string;
}

export interface IText {
  en: string;
  fi: string;
  sv: string;
}

export interface IFields {
  id: IId;
  text: IText;
}

export interface ITranslation {
  [key: string]: string;
}

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2020-05-26
    • 1970-01-01
    • 2013-02-15
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多