我的应用程序中的代码使用array.reduce将数字相乘。 它看起来像这样:
// Private function to multiply field values together
function _multipleFields(product, fields) {
// Calculate our total
var total = fields.reduce(function (total, field) {
// Get our number from our field
var fieldValue = helper.getPropertyValue(product, field.trim()),
number = _extractNumber(fieldValue);
return total * number;
}, 1);
// Return our total
return total;
};
我想用类似的逻辑来划分数字。 我以为我可以只更改运算符,但第一次迭代中的总计等于 1 。对于很好的乘法,但是对于除法,它不是。
有人可以帮我一把吗?
答案 0 :(得分:1)
如果您打算生产例如((a / b) / c)
给定输入数组[a, b, c]
然后你应该省略“初始值”字段,因为除法运算符没有“标识”值,方式为“0”是加法的标识,“1”是乘法的标识。
function divideArray(array) {
return array.reduce(function(total, number) {
return total / number;
});
}
如果仅提供单个值,这将减少(不是真正意图)返回原始值,因为根据定义,如果仅提供单个值,reduce
函数不会调用其回调。
通过适当地分离关注点并将功能简化到最小的可测试单元,您的整个代码可以减少到:
function _getFieldNumber(product, field) {
return _extractNumber(helper.getPropertyValue(product, field.trim()));
}
function _getFieldNumbers(product, fields) {
return fields.map(_getFieldNumber.bind(this, product));
}
function _multipleFields(product, fields) {
return _getFieldNumbers(product, fields).reduce(multiply, 1);
}
function _divideFields(product, fields) {
return _getFieldNumbers(product, fields).reduce(divide);
}
function multiply(a, b) { return a * b; }
function divide(a, b) { return a / b; }
答案 1 :(得分:1)
当您使用类似的乘法和除法函数时,您应该尝试将它们设为通用。
一种方法是从中获取第一个字段并从中提取数字,并将其用作.reduce
的initialValue。这样你就可以保持结构相同。
function _operateFields(product, fields, operand) {
var initial = getNumericValue(product, fields[0])
var total = fields.slice(1).reduce(function(total, field) {
var num = getNumericValue(product, field);
return (operand === "/") ? total / num: total * num
}, initial);
return total;
};
function getNumericValue(product, field) {
return _extractNumber(helper.getPropertyValue(product, field.trim()));
}
答案 2 :(得分:0)
我通过这样做来管理它:
John, Smith, 012334567
Mickael, Senders, 012334567
Tom, Triov, 012334567
John, Refus, 012334567