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

Само осуществление не должно иметь значения для этого вопроса. Вопрос в том, почему код создает неверные результаты. Я проверил, верят ли сумма и avg правильные значения - они это делают. Вероятно, result[person] в цикле for..in вызывает проблему, и я не совсем понимаю почему.

ответ

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), однако с вызовом он запрашивает тип номера. Он не должен показывать окончание 0s. Но теперь другая проблема заключается в том, что он не пройдет тесты, потому что, по-видимому, 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 
 
}))