拆分账单 - 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 return 是否正确的值 - 他们确实如此。可能是 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
}))