繁体   English   中英

JavaScript Array.reduce划分

[英]JavaScript Array.reduce divide

我的应用程序中有使用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 对于乘法来说很好,但是对于除法则不是。

有人可以帮我吗?

如果您的意图是在给定输入数组[a, b, c]情况下生成例如((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 这样,您可以保持结构不变。

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()));
}

我通过这样做来管理它:

// 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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM