2015-07-11 93 views
0

我必须创建此更改计算器,它返回您从事务中返回的更改量,并且还返回下面关联数组中的硬币。如何正确地遍历关联数组,当其中一个键是“1”?

不幸的是我无法通过遍历数组正确(最高钥匙500起:“$ 5”),因为它总是以1个便士(1:“1P”)开始,然后2等

所以对于例如,如果物品的价格为5美元,我支付5.75美元,而不是返回50p,20p,5p,硬币,它是1p,2p,5p,10p,20p。

谢谢!

  var coins = {500:"$5", 200:"$2", 100: "$1", 50: "50p", 20:"20p", 10:"10p", 5:"5p", 2:"2p", 1:"1p"}; 
     $('#calc').click(function(){ 
      var priceVar = document.getElementById("price").value; 
      var paidVar = document.getElementById("paid").value;     
      var result = (paidVar - priceVar).toFixed(2); 
      var paidCents = result * 100; 
      var coinList = ""; 
       for(var key in coins) { 
        if (paidCents >= key) { 
         paidCents -= key; 
         coinList += coins[key]; 
        }  
       }  
      $('#change').html("$"+result); 
      $('#coins').html(coinList);}); 
+0

你的数组看起来像这个'coins = [{denom:“$ 5”,value:500},{denom:“$ 2”,value:200} ... etc]'或者它必须和你一样展示下?如果你可以将它设置为一个对象数组,你可以按顺序遍历它们 –

+0

我想知道的另外一件事情 - 你使用美元和“p”。不是美元和美分“C”? –

+0

不幸的是,它必须是这样的:(它曾经是英镑符号而不是美元,但由于某种原因,它在我的浏览器中以一种奇怪的方式显示它可能是一个语言包问题 –

回答

0

试试这个:

var coins = {500:"$5", 200:"$2", 100: "$1", 50: "50p", 20:"20p", 10:"10p", 5:"5p", 2:"2p", 1:"1p"}; 
     $('#calc').click(function(){ 
      var priceVar = document.getElementById("price").value; 
      var paidVar = document.getElementById("paid").value;     
      var result = (paidVar - priceVar).toFixed(2); 
      var paidCents = result * 100; 
      var coinList = ""; 
while(paidCents > 0){ 
       for(var key in coins) { 
        if (paidCents < key || key == '500') { 
if(key == '500' && paidCents >= key){ lasttry = key; } 
         paidCents -= lasttry; 
         coinList += coins[lasttry]; break; 
        } lasttry = key;  
       }  } 
      $('#change').html("$"+result); 
      $('#coins').html(coinList);}); 

两件事情: - 即使你的对象有500开始,JavaScript的还是会围着它转,最低将是第一个,当你通过它循环。 - 同样在你的for循环中,它只会使用每种类型的硬币中的一种。所以对于45,它不会需要两次20.这就是为什么我必须使用while循环。

+0

刚刚测试过它,例如当价格为4美元,而你支付了6.75美元时,它会返还5美元硬币的变化吗? –

+0

你说得对,在PayCents和钥匙之间的'<'(如果(key =='500'&& paidCents '。对不起,现在检查它 – OSDM

+0

它工作的一切除了当变化是$ 5。(它显示$ 2 $ 2 $ 1),所以我添加了一个额外的if语句:if(paidCents == '500'){ \t \t \t \t \t \t \t coinList + = “5 $”; \t \t \t \t \t \t \t paidCents = 0; \t \t \t \t \t \t \t break; \t \t \t \t \t \t} –