DRY 将两个功能合二为一

DRY combine two functions in one

我正在尝试重构我的代码并注意到我在重复自己。想知道是否有办法将这两个功能合二为一?

export const fn1 = article => article.categoryValueDtoSet.reduce((res, item) => {
  const result = { ...res };
  if (item.language) {
    const language = item.language.languageValue;
    const category = item.categoryValue;
    result[language] = category;
  }
  return result;
  }, { it: undefined, de: undefined, en: undefined );


  export const fn2 = article => article.titleDtoSet.reduce((res, item) => {
  const result = { ...res };
  if (item.language) {
    const language = item.language.languageValue;
    const category = item.titleValue;
    result[language] = title;
  }
  return result;
  }, { it: undefined, de: undefined, en: undefined );

首先,您需要将函数作为回调传递给 reduce 函数。为此,您可以使用 higher-order function ,它基本上是 returns 函数的函数。我们可以调用这个函数dry

const dry = (fieldName) => (res, item) => {
  const result = { ...res };
  if (item.language) {
    const language = item.language.languageValue;
    result[language] = item[fieldName];
  }
  return result;
}

然后我们可以提取传递给 reduce 回调的初始对象:

const intialValueObject = { it: undefined, de: undefined, en: undefined };

然后将dry函数作为参数传递给reduce函数:

export const fn1 = article => article.categoryValueDtoSet.reduce(dry('categoryValue'), { ...initialValueObject });

export const fn2 = article => article.titleDtoSet.reduce(dry('titleValue'), { ...intialValueObject });

总有办法的。您能否更具体地说明您的限制条件?

如果不出意外,可以分享reduce逻辑


let reducer = (res, item) => {
  const result = { ...res };
  if (item.language) {
    const language = item.language.languageValue;
    const category = item.categoryValue;
    result[language] = category;
  }
  return result;
}

export const fn1 = article => article.categoryValueDtoSet.reduce(reducer, { it: undefined, de: undefined, en: undefined });


export const fn2 = article => article.titleDtoSet.reduce(reducer, { it: undefined, de: undefined, en: undefined });

最直接最简单的,尽管命名不好,因为我不知道这一切代表什么:

function reduceIt(it) {
  return it.reduce((res, item) => {
    const result = { ...res };
    if (item.language) {
      const language = item.language.languageValue;
      const category = item.categoryValue;
      result[language] = category;
    }
    return result;
  }, { it: undefined, de: undefined, en: undefined });
}

export const fn1 = article => reduceIt(article.categoryValueDtoSet);
export const fn2 = article => reduceIt(article.titleDtoSet);