繁体   English   中英

拆分账单-JavaScript练习

[英]Splitting a Bill - JavaScript exercise

我目前正在学习JS,并且正在尝试进行编码练习。 到目前为止,我已经在离线和在线部分代码中使用了大量资源来整理以下代码。 我非常接近-只是无法在我的结果中得出正确的数字。

一些上下文:将一个对象输入到函数中,输出一个函数,该函数根据对象中的(总账单/人)显示每个人应该支付或收取的金额。 每个属性==人。 结果必须四舍五入到小数点后两位。

function splitTheBill(group) {
    var result = {};
    var sum = 0;

    for (var person in group) {
        sum += group[person];
        var avg = sum / (Object.keys(group).length);
        result[person] = Math.floor(-100 * (group[person] - avg))/100;
    }
    return result;
}

splitTheBill({A: 7, B: 3, C: 2});

// console result comes out to be: { A: -4.67, B: 0.33, C: 2 }

// if avg of above object is 4, then answer should be: {A: -3.00, B: 1.00, C: 2.00} 

对于这个问题,练习本身并不重要。 问题更多的是为什么代码会产生不正确的结果。 我检查了sum和avg是否返回正确的值-它们确实可以。 for..in循环中的result[person]可能引起问题,但我不完全理解为什么。

您无法获得尚未完全累加的总和的平均值,因此您的avg变量不是您想的那样。

 function splitTheBill(group) { var result = {}; var sum = 0; for (var key in group) { sum += group[key]; } var avg = sum / (Object.keys(group).length); for (var person in group) { result[person] = Math.floor(-100 * (group[person] - avg))/100; } return result; } var r = splitTheBill({A: 7, B: 3, C: 2}); console.log(r); 

使用两个循环,可能可以更有效地完成操作,但至少是冗长的。
另请注意,数字不能为1.00等。您需要使用.toFixed(2)创建的字符串

应该像

 function splitTheBill(obj) { //find the total var total = 0; Object.keys(obj).forEach(function(key) { total += obj[key] }); //find the average var average = total / (Object.keys(obj).length); //now do the splitting var result = {}; Object.keys(obj).forEach(function(key) { result[key] = average - obj[key] }); return result; } console.log(splitTheBill({ A: 7, B: 3, C: 2 })) 

暂无
暂无

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

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