拆分账单 - JavaScript练习

时间:2016-10-01 07:26:27

标签: javascript javascript-objects for-in-loop

我目前正在学习JS,而且我正在努力完成编码练习。到目前为止,我已经设法在离线和在线的部分代码上使用大量资源拼凑以下代码。我非常接近 - 只是不能在我的结果中得到正确的数字。

某些背景: 在对象中输入一个对象,输出一个函数,显示每个人应该根据(对象中的总账单/人)支付或接收的金额。每个属性==人。结果必须向下舍入到2位小数。

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]导致问题,而且我不完全明白为什么。

2 个答案:

答案 0 :(得分:2)

您无法获得尚未完全累加的总和的平均值,因此您的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)

创建的字符串

答案 1 :(得分:0)

应该像

一样简单

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
}))