Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript数组.reduce divide_Javascript - Fatal编程技术网

JavaScript数组.reduce divide

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

我的应用程序中有使用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;
};
我想用类似的逻辑来划分数字。 我原以为我可以只更改运算符,但第一次迭代中的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