JavaScript数组.reduce divide
我的应用程序中有使用array.reduce将数字相乘的代码。 看起来是这样的:JavaScript数组.reduce divide,javascript,Javascript,我的应用程序中有使用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
// 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;
};
我想用类似的逻辑来划分数字。
我原以为我可以只更改运算符,但第一次迭代中的total等于1。对于乘法来说这很好,但对于除法来说却不是
有人能帮我一把吗?我是这样做的:
// Private function to divide field values together
function _divideFields(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 ? total / number : number;
}, 0);
// Return our total
return total;
};
我通过这样做来管理它:
// Private function to divide field values together
function _divideFields(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 ? total / number : number;
}, 0);
// Return our total
return total;
};
如果您的目的是在给定输入数组
[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; }
如果您的目的是在给定输入数组
[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; }
当您使用类似的函数进行乘法和除法运算时,您应该尝试使它们通用 一种方法是获取第一个字段并从中提取数字,然后将其用作
的初始值。reduce
。这样可以保持结构不变
函数\u运算符字段(乘积、字段、操作数){
var initial=getNumericValue(产品,字段[0])
var total=fields.slice(1).reduce(函数(总计,字段){
var num=getNumericValue(产品,字段);
返回(操作数==“/”)?总计/num:total*num
},首字母);
返回总数;
};
函数getNumericValue(产品,字段){
返回_extractNumber(helper.getPropertyValue(product,field.trim());
}
当您在乘法和除法中使用类似的函数时,您应该尝试使它们通用
一种方法是获取第一个字段并从中提取数字,然后将其用作的初始值。reduce
。这样可以保持结构不变
函数\u运算符字段(乘积、字段、操作数){
var initial=getNumericValue(产品,字段[0])
var total=fields.slice(1).reduce(函数(总计,字段){
var num=getNumericValue(产品,字段);
返回(操作数==“/”)?总计/num:total*num
},首字母);
返回总数;
};
函数getNumericValue(产品,字段){
返回_extractNumber(helper.getPropertyValue(product,field.trim());
}
你说的除法是什么意思?你的用例是什么?你能举个例子吗?不过这两种操作在本质上是非常不同的。一个是可交换的,另一个不是:a*b==b*a
,而是a/b!=b/a
给定一个数组[a,b,c]
是否要((a/b)/c)
?如果数组中只有一个元素呢?除法是什么意思?你的用例是什么?你能举个例子吗?不过这两种操作在本质上是非常不同的。一个是可交换的,另一个不是:a*b==b*a
,而是a/b!=b/a
给定一个数组[a,b,c]
是否要((a/b)/c)
?如果数组中只有一个元素呢?虽然这是一种理想的方法,但他是使用函数获取数字的。所以他必须通过初审value@Rajesh请多解释一下——你说的毫无意义。值的来源没有区别。抱歉,OP正在执行number=\u extractNumber(fieldValue)代码>以获取数值。这样做arr.reduce((p,c)=>p/c)
将不起作用,因为initialValue的偶数值应该使用相同的方法进行解析value@Rajesh上面的代码是一个清晰的职责分离示例,其中重复划分的数学运算与从源数据中提取值分离。它并不打算完全插入OP的代码。同样如前所述,没有初始值。@Rajesh理想情况下,OP应该有一个\u extractFields
函数,该函数只将值提取到数组中,然后\u multipleFields
和\u divideFields
的实现将首先调用该函数,然后是执行所需数学运算的适当函数。诚然,它的效率不如在一个.reduce
循环中完成所有操作,但它会更干净、更易于维护。虽然这是一种理想的方法,但他是在使用函数获取数字。所以他必须通过初审value@Rajesh请多解释一下——你说的毫无意义。值的来源没有区别。抱歉,OP正在执行number=\u extractNumber(fieldValue)代码>以获取数值。这样做arr.reduce((p,c)=>p/c)
将不起作用,因为initialValue的偶数值应该使用相同的方法进行解析value@Rajesh上面的代码是一个清晰的职责分离示例,其中重复划分的数学运算与从源数据中提取值分离。它并不打算完全插入OP的代码。同样如前所述,没有初始va