【问题标题】:how to properly access a javascript "dictionary" like this one如何正确访问像这样的javascript“字典”
【发布时间】:2016-12-22 09:49:43
【问题描述】:

你能帮忙指出我的代码有什么问题吗: 目标是计算 3 人用餐派对的总消费金额,每人点 2 道菜。

我知道还有其他方法可以使用 'this' 和 'new' 以更 oop 的方式执行此操作,但我认为我的方法更具可读性..如果我能让它工作。如果每个顾客只点 1 道菜,代码就可以正常工作,所以我尝试访问 JS 字典的方式有问题。

抱歉,新手问题。感谢您的帮助!

var diners=[
 {name:'adam', entree1:'ramen', price1:11.5, entree2: 'miso', price2 : 3},

 {name:'bobby', entree1: 'udon', price1 :10.69, entree2: 'gyoza', price2 :4.5},

{name:'carly', entree1: 'teriyaki chicken', price1:12, entree2: 'miso', price2 : 3},
];

  var entrees1_total=0;
  for (var d in diners){


 entrees1_total +=  diners[d].price1; //total expense of entree1 for all diners  

 diners[d].tax1 = diners[d].price1*0.082; // method for sales tax

 entrees1_total += diners[d].tax1; //total entree1 price including sales tax
 }

 var entrees2_total=0;
 for (var d in diners){


entrees2_total += diners[d].price2;

diners[d].tax2 = diners[d] * price2 * 0.082;

entrees2_total += diners[d].tax2;
}

 var total = entree1_total + entree2_total;

 var total_bill = total*1.2;   //tips

 console.log("total is: " + total_bill.toString());

 for (var d in diners) {
 console.log(diners[d].name + " spends " + (diners[d].price1 + diners[d].tax1)+(diners[d].price2 + diners[d].tax2));
    }   // print out total spent for each patron

【问题讨论】:

标签: javascript loops object dictionary


【解决方案1】:

这句话看起来不正确

diners[d].tax2 = diners[d] * price2 * 0.082;

我猜你的意思是“diners[d].price2”

【讨论】:

    【解决方案2】:

    您可以只使用.reduce() 来迭代数组并保持运行总数:

    var rawTotal = diners.reduce(function(cum, obj) {
       return cum + obj.price1 + obj.price2;
    }, 0);
    
    // add in tax and tip
    var tax = rawTotal * 0.082;
    var tip = rawTotal * 0.2;    // assumes you don't include taxes in tip calculation
    var finalTotal = rawTotal + tax + tip;
    

    工作演示:https://jsfiddle.net/jfriend00/ure3r2jg/


    关于您的代码的几点说明:

    1. 永远不要使用 for/in 来迭代数组。 for/in 迭代对象的所有属性,其中包括数组元素,但也可以包括其他可枚举属性(如果已将任何属性添加到对象中)。相反,使用.forEach().map().reduce() 或常规的for (var i = 0; i < array.length; i++) 循环或在ES6 中使用for/of

    2. 您的销售税计算不正确。您将每个小计值相乘,这意味着早期值将多次乘以销售税值。最简单的方法是累积常规总额,然后在最后应用销售税。或者,仅将销售税乘以每个新价格,而不是累计总额。

    3. 您必须决定小费是在税前还是税后计算。这是一个偏好问题,但我已经说明了小费是在税前计算的。

    【讨论】:

    • 我喜欢你的解决方案!您不仅指出了我的代码中的错误,而且还提供了一个更好的带有 reduce 的 FP 风格的解决方案。还要感谢关于避免 for/in 循环的建议。
    【解决方案3】:

    首先 - 您的 diners 变量不是字典,而是一组匿名对象。因此,您不能通过对象 diners[1] 来索引数组,而只能通过数组中 objetc 的序号来索引。为此,您使用循环。 您的代码中还有其他拼写错误。 在下面找到固定且有效的代码:

    var diners=[
     {name:'adam', entree1:'ramen', price1:11.5, entree2: 'miso', price2 : 3},
    
     {name:'bobby', entree1: 'udon', price1 :10.69, entree2: 'gyoza', price2 :4.5},
    
    {name:'carly', entree1: 'teriyaki chicken', price1:12, entree2: 'miso', price2 : 3},
    ];
    
      var entrees1_total=0;
      for (d=0; d < diners.length; d++){
    
    
     entrees1_total +=  diners[d].price1; //total expense of entree1 for all diners  
    
     diners[d].tax1 = diners[d].price1 * 0.082; // method for sales tax
    
     entrees1_total += diners[d].tax1; //total entree1 price including sales tax
     }
    
     var entrees2_total=0;
     for (d=0; d < diners.length; d++){
    
    
    entrees2_total += diners[d].price2;
    
    diners[d].tax2 = diners[d].price2 * 0.082;
    
    entrees2_total += diners[d].tax2;
    }
    
     var total = entrees1_total + entrees2_total;
    
     var total_bill = total*1.2;   //tips
    
     console.log("total is: " + total_bill.toString());
    
     for (var d in diners) {
     console.log(diners[d].name + " spends " + (diners[d].price1 + diners[d].tax1)+(diners[d].price2 + diners[d].tax2));
        }   // print out total spent for each patron

    【讨论】:

      【解决方案4】:

      您在第二个循环中犯了一些错误,导致 console.log 像字符串一样工作。不是一个数字。所以工作代码是

      var diners=[
       {name:'adam', entree1:'ramen', price1:11.5, entree2: 'miso', price2 : 3},
      
       {name:'bobby', entree1: 'udon', price1 :10.69, entree2: 'gyoza', price2 :4.5},
      
      {name:'carly', entree1: 'teriyaki chicken', price1:12, entree2: 'miso', price2 : 3},
      ];
      
        var entrees1_total=0;
        for (var d in diners){
      
      
       entrees1_total +=  +diners[d].price1; //total expense of entree1 for all diners
      
       diners[d].tax1 = diners[d].price1*0.082; // method for sales tax
      
       entrees1_total += +diners[d].tax1; //total entree1 price including sales tax
       }
      
       var entrees2_total=0;
       for (var d in diners){
      
      
      entrees2_total += +diners[d].price2;
      
      diners[d].tax2 = diners[d].price2 * 0.082;
      
      entrees2_total += +diners[d].tax2;
      }
      
       var total = entrees1_total + entrees2_total;
      
       var total_bill = total*1.2;   //tips
      
       console.log("total is: " + total_bill.toString());
      
       for (var d in diners) {
       console.log(diners[d].name + " spends " + (diners[d].price1 +diners[d].tax1 +    diners[d].price2 + diners[d].tax2));
       }

      【讨论】:

      • 你是对的。考虑到我正在复制和粘贴第一个 for 循环,不知道我是如何设法搞砸的,哈哈。这是漫长的一天。
      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      相关资源
      最近更新 更多