#javascript #javascript-objects #for-in-loop
#javascript #javascript-объекты #для-в-цикле
Вопрос:
В настоящее время я изучаю 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 resu<
}
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 правильные значения — они возвращают. Скорее result[person]
всего, в for..in цикл вызывает проблему, и я не совсем понимаю, почему.
Ответ №1:
Вы не можете получить среднее значение суммы, которая еще не полностью сложена, поэтому ваша 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 resu<
}
var r = splitTheBill({A: 7, B: 3, C: 2});
console.log(r);
возможно, использование двух циклов можно было бы сделать более эффективно, но, по крайней мере, это подробно.
Также обратите внимание, что числа не могут быть 1.00
etc. для этого вам понадобятся строки, созданные с помощью .toFixed(2)
Комментарии:
1. Да, я понял, что могу использовать .toFixed(2), однако с проблемой он запрашивает тип числа. Не обязательно показывать конечные 0. Но теперь другая проблема заключается в том, что он не пройдет тесты, потому что, по-видимому, 0 * -1 = -0, и он хочет видеть 0.
2. И да, в некоторых очень редких случаях
-0
это не то же самое, что0
, но вы можете решить это легко
Ответ №2:
Должно быть таким же простым, как
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 resu<
}
console.log(splitTheBill({
A: 7,
B: 3,
C: 2
}))