我在下面编写了这个函数,它按产品类型和货币类型转换传递的产品数组
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/