2016-10-01 58 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 
 
}))