javascript - 如何让这个功能更可重用/更具体/更好的设计?

标签 javascript arrays functional-programming reusability partial-application

我在下面编写了这个函数,它按产品类型和货币类型转换传递的产品数组

function getProductsByCurrency(products, type, exchangeRate = 1) {
    var productsRetrieved = products.map(item => ({id: item.id,
        name: item.name,
        price: (item.price * exchangeRate).toFixed(2),
        type: type}));
    return productsRetrieved;       
}

是否可以将功能分解得更具体?或者以更好的方式设计它? 例如,通过将其命名为 getProductsByCurrency 它看起来不正确,因为如果我以默认汇率使用它,我可以传递书籍数组以检索具有独立于汇率的“书籍”类型的产品。 也许有一种方法可以使用偏函数(FP)?

编辑: 为我想要实现的目标添加更多上下文。

假设我有三类产品(手机、化妆品、书籍) 来自三个资源。我需要按不同货币(productsinUSD、productsinAUD、productsinPounds)创建三个合并的所有产品数组

同样使用下面的函数来合并数组

    function concatProducts(arr) {
        return [].concat.apply([], arr);
    }

所以我调用了 3 次 getProductsByCurrency 以按产品类型和货币(汇率)转换它们并将这些值作为数组传递以连接它们以实现 productsinUSD。并重复以获取以澳元为单位的产品,以磅为单位的产品。

类型也是字符串值(例如:'mobiles')

最佳答案

首先,您发布的功能没有任何错误。有几件事我会做不同的事情,但我不会假装这不是 split 头发。

const processItem = (type, exchangeRate = 1) => ({
  id,
  price,
  name,
}) => ({
  id,
  name,
  type,
  price: (price * exchangeRate).toFixed(2),
});

我们有一个函数,它接受一个类型和一个可选的 exchangeRate 并返回一个将单个项目转换为您想要的形式的函数。这就是鲍勃在评论中所说的。我还在项目上使用了对象解构,在结果上使用了属性速记,以使代码更清晰。现在我们可以将它映射到各种类别的东西上:

const results = [
   ...mobilePhones.map(processItem('phone')),
   ...cosmetics.map(processItem('cosmetics')),
   ...books.map(processItem('book')),
];

如果您出于其他目的需要临时结果,只需将它们填充到 vars 中即可,但为简单起见,我已将它们直接分散到结果数组中。

虽然这比您发布的代码质量帽子戏法更短、更清晰、更灵活,但我想重申,我看到的方式比您发布的功能更糟糕。

关于javascript - 如何让这个功能更可重用/更具体/更好的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802704/

相关文章:

javascript - 后端 JSON 到前端的 HTML

java - 获取数组类型的 Class 对象的最佳方法是什么?

javascript - Ramda 中的 curry 和偏函数有什么区别?

haskell - 显式确定要使用哪个纯函数

javascript - 如何将 blob 上传到 Parse?

Javascript 复杂图

python - 在不重复上一项的情况下在 Python 中对列表进行排序

arrays - 二维数组中非相邻元素的最大和

java - 什么是惯用的 "functional"方法来获取 Optional<String> 并在 null 或空时返回默认字符串,否则返回修改后的字符串?

javascript - 沿对 Angular 线拖放?