javascript - javascript 函数无法生成精确的更改

标签 javascript arrays javascript-objects

我正在应对来自在线编码社区的挑战。 目标是编写一个生成精确变化的函数 从最高到最低使用中显示的面额 CID 数组(抽屉里的现金)。该函数需要三个 参数、价格、现金、cid。 Cid 是抽屉里的现金。

我正在尝试比较现金金额 cid 面额与现金金额 精确的变化计算。

例如,如果更改 = 96,则从最高值精确更改为 最低的是

['twenty', 80], ['ten', 1], ['five', 1],
['one', 1]

。但是,如果 CID 显示 ['twenty', 60], ['ten', 20], ["Five, 55] 则 代码必须使用 cid 中的金额计算准确的找零。 在这种情况下,结果将是,

['twenty', 60], ['ten', 20],
['five', 15], ['one', 1]

在下面的代码中,display() 函数包含一个条件语句 目的是在CID值中进行比较和切换 如果需要的话。但是,这会导致重复值 [“二十”]出现。我的问题是什么导致了这个问题 我该如何修复它。

函数的输入产生以下错误结果:

 [ [ 'TWENTY', 60 ],
  [ 'TWENTY', 20 ],
  [ 'TEN', 10 ],
  [ 'FIVE', 5 ],
  [ 'ONE', 1 ],
  [ 'QUARTER', 0.5 ],
  [ 'DIME', 0.2 ],
  [ 'PENNY', 0.04 ] ]

我已经包含了下面的代码,但我设置了一个模型] 在http://repl.it/BAku/2 .

function drawer(price, cash, cid){
    var change = cash - price;
    change = change.toFixed(2);
    change = +change;
    var combine = [];

    var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];

    var denomMap = [
        100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
    ];

    function total(cid){
        var cashAmts = [];
        cid.forEach(function(v){
            cashAmts.push(v[1]);
        },0);
            var sum = cashAmts.reduce(function(a, b){return a + b;
            }).toFixed(2);
            return +sum;
    }

            if(cash < price){
                return price;
            }
            else if(total(cid) < change){
                return "Insufficient Funds";
            }
            else if(total(cid) === change){
                return "Closed";
            }
            else if(total(cid) > change){
                return display(change, cid);
        }



    function display(change) {
        var temp;
        num = change;
        var num = change;
        var value = '';
        for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
            while (change >= denomMap[i]) {
                change += denomMap[i + 1];
                change = change.replace(/\d+/g, "");
                change = change.replace(/\./g, "");
                value += denomMap[i];
                var div = Math.floor(num/+value) * denomMap[i];

                if(change === cidMap[0][0] && div > cidMap[0][1]){
                    div = cidMap[0][1];
                }
                else if(change === cidMap[1][0] && div > cidMap[1][1]){
                    div = cidMap[1][1];
                }
                 else if(change === cidMap[2][0] && div > cidMap[2][1]){
                    div = cidMap[2][1];
                }
                 else if(change === cidMap[3][0] && div > cidMap[3][1]){
                    div = cidMap[3][1];
                }
                 else if(change === cidMap[4][0] && div > cidMap[4][1]){
                    div = cidMap[4][1];
                }
                 else if(change === cidMap[5][0] && div > cidMap[5][1]){
                    div = cidMap[5][1];
                }
                 else if(change === cidMap[6][0] && div > cidMap[6][1]){
                    div = cidMap[6][1];
                }
                 else if(change === cidMap[7][0] && div > cidMap[7][1]){
                    div = cidMap[7][1];
                }
                else if(change === cidMap[8][0] && div > cidMap[8][1]){
                    div = cidMap[8][1];
                }

                temp = [change, div];
                combine.push(temp);
                num = (num - div).toFixed(2);
                num = +num;
                display(num);
            }
        }

        return combine;
    }  

}

drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]);

最佳答案

What is causing this?

您正在从抽屉中取出所有三个 'TWENTY' 便笺,但没有更新抽屉以反射(reflect)现在没有剩余 'TWENTY' 便笺。因此,在下一次循环迭代中,抽屉错误地认为您还有另一个 'TWENTY' 注释要给出。

How do I fix it?

提款后更新抽屉中的现金,并附上剩余现金的支票。这是一种对原始代码进行最少修改的方法,可以帮助您获得一些见解。

记下 changeAvailable 函数及其调用位置。另请注意抽屉的更新(例如,三个 TWENTY 注释:cidMap[7][1] = 0;)。

http://jsbin.com/vapobu/edit?js,console

(function () {

  "use strict";

function drawer(price, cash, cid){
    var change = cash - price;
    change = change.toFixed(2);
    change = +change;
    var combine = [];

    var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];

    var denomMap = [
        100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
    ];

    function display(change) {
        var temp;
        //num = change;//use global variables sparingly, preferably within a namespace, suspect type-o
        var num = change;
        var value = '',
            changeAvailable = function (nameOfCurrency) {
              var queryCash = cid.filter(function (currentCurrency) {
                return currentCurrency[0] === nameOfCurrency;
              }),
                  cashRemaining = queryCash[0][1];
              return (cashRemaining !== 0);            
            };
        for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
            while (change >= denomMap[i] && changeAvailable(denomMap[i + 1])) {
                change += denomMap[i + 1];
                change = change.replace(/\d+/g, "");
                change = change.replace(/\./g, "");
                value += denomMap[i];
                var div;
                   div = Math.floor(num/+value) * denomMap[i];

                if(change === cidMap[0][0] && div > cidMap[0][1]){
                    div = cidMap[0][1];
                    cidMap[0][1] = 0;
                }
                else if(change === cidMap[1][0] && div > cidMap[1][1]){
                    div = cidMap[1][1];
                    cidMap[1][1] = 0;
                }
                 else if(change === cidMap[2][0] && div > cidMap[2][1]){
                    div = cidMap[2][1];
                    cidMap[2][1] = 0;
                }
                 else if(change === cidMap[3][0] && div > cidMap[3][1]){
                    div = cidMap[3][1];
                    cidMap[3][1] = 0;
                }
                 else if(change === cidMap[4][0] && div > cidMap[4][1]){
                    div = cidMap[4][1];
                    cidMap[4][1] = 0;
                }
                 else if(change === cidMap[5][0] && div > cidMap[5][1]){
                    div = cidMap[5][1];
                    cidMap[5][1] = 0;
                }
                 else if(change === cidMap[6][0] && div > cidMap[6][1]){
                    div = cidMap[6][1];
                    cidMap[6][1] = 0;
                }
                 else if(change === cidMap[7][0] && div > cidMap[7][1]){
                    div = cidMap[7][1];
                    cidMap[7][1] = 0;
                    //temp = [change, div];//duplicated code
                }
                else if(change === cidMap[8][0] && div > cidMap[8][1]){
                    div = cidMap[8][1];
                    cidMap[8][1] = 0;
                }

                temp = [change, div];
                combine.push(temp);
                num = (num - div).toFixed(2);
                num = +num;
                display(num);
            }
        }

        return combine;
    }

      function total(cid){
        var cashAmts = [];
        cid.forEach(function(v){
            cashAmts.push(v[1]);
        },0);
            var sum = cashAmts.reduce(function(a, b){return a + b;
            }).toFixed(2);
            return +sum;
    }

            if(cash < price){
                return price;
            }
            else if(total(cid) < change){
                return "Insufficient Funds";
            }
            else if(total(cid) === change){
                return "Closed";
            }
            else if(total(cid) > change){
                return display(change, cid);
        }
}

console.log(drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]));

}());

关于javascript - javascript 函数无法生成精确的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31886845/

相关文章:

javascript - 检查下一项是否长 1 个单位 (Javascript)

javascript - 获取 API 和 Cordova

javascript - 进入页面时未知的 JavaScript 脚本滚动

javascript - 将带有特殊字符的字符串拆分为数组

javascript - 将对象数组内的索引相对链接到特定的 HTML div

javascript - 如何实例化并获取多维数组/矩阵的长度?

c - 我的 C 代码中出现奇怪的结果

javascript - 如何通过for循环填充关联数组

javascript - 使用 JavaScript 对象构造函数

javascript - 数组 > 对象 : how to index an array of objects with reduce, 省略结果中嵌套元素的索引(es2017)?