我目前正在学习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]
导致问题,而且我不完全明白为什么。
答案 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
}))