2016-10-01 60 views
0

我目前正在学习JS,而且我正在尝试通过编码练习。到目前为止,我已经成功地将部分代码中的大量资源脱机并联机,将以下代码拼凑在一起。我非常接近 - 在我的结果中无法获得正确的数字。分割条例草案 - JavaScript练习

一些背景: 输入一个对象到函数中,输出一个函数,显示每个人应该根据对象中的(总账单/人)支付或接收多少钱。每个属性==人。结果必须舍入到小数点后两位。

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

你不能得到尚未完全加起来的总和的平均值,所以你的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)

+0

是的,我意识到我可以使用.toFixed(2),但是在挑战中,它需要一个数字类型。它不必显示结尾0。 但现在的另一个问题是,它不会通过测试,因为显然0 * -1 = -0,它想看到一个0. – aizkhaj

+0

是的,在一些非常罕见的情况下,'-0'是不一样的'0',但你可以很容易地解决 – adeneo

+0

https://jsfiddle.net/m9kqyus3/ – adeneo

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