JavaScript Array.reduce除

时间:2017-03-17 10:49:49

标签: 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 number from our field
        var fieldValue = helper.getPropertyValue(product, field.trim()),
            number = _extractNumber(fieldValue);

        return total * number;
    }, 1);

    // Return our total
    return total;
};

我想用类似的逻辑来划分数字。 我以为我可以只更改运算符,但第一次迭代中的总计等于 1 。对于很好的乘法,但是对于除法,它不是。

有人可以帮我一把吗?

3 个答案:

答案 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