Безумие округления. Независимо от кода, у меня постоянно возникают проблемы с округлением. Я не знаю, что еще делатьJavascript

Форум по Javascript
Ответить
Anonymous
 Безумие округления. Независимо от кода, у меня постоянно возникают проблемы с округлением. Я не знаю, что еще делать

Сообщение Anonymous »

Я застрял на упражнении. Ребята, мне очень нужна ваша помощь!
Упражнение:

Инструкции
Создайте 3 функции, которые работают как методы массива .filter, .map и .reduce, но для записей в корзине покупок. Создайте 3 дополнительные функции, которые используют ранее созданные функции и принимают объект в качестве входных данных:
  • Код: Выделить всё

    totalCalories
    : возвращает общее количество калорий в корзине.
  • Код: Выделить всё

    lowCarbs
    : после расчета общего количества в корзине остаются только те позиции, которые содержат менее 50 граммов углеводов.
  • Код: Выделить всё

    cartTotal
    : это даст вам необходимое количество калорий, белков и т. д. для каждого товара в вашей продуктовой корзине.
Подумайте о форме Object.entries()
Предоставленный код
Предоставленный код будет добавлен в ваше решение, и его не нужно отправлять.

Код: Выделить всё

// small database with nutrition facts, per 100 grams
// prettier-ignore
const nutritionDB = {
tomato: {
calories: 18,
protein: 0.9,
carbs: 3.9,
sugar: 2.6,
fiber: 1.2,
fat: 0.2
},
vinegar: {
calories: 20,
protein: 0.04,
carbs: 0.6,
sugar: 0.4,
fiber: 0,
fat: 0
},
oil: {
calories: 48,
protein: 0,
carbs: 0,
sugar: 123,
fiber: 0,
fat: 151
},
onion: {
calories: 0,
protein: 1,
carbs: 9,
sugar: 0,
fiber: 0,
fat: 0
},
garlic: {
calories: 149,
protein: 6.4,
carbs: 33,
sugar: 1,
fiber: 2.1,
fat: 0.5
},
paprika: {
calories: 282,
protein: 14.14,
carbs: 53.99,
sugar: 1,
fiber: 0,
fat: 12.89
},
sugar: {
calories: 387,
protein: 0,
carbs: 100,
sugar: 100,
fiber: 0,
fat: 0
},
orange: {
calories: 49,
protein: 0.9,
carbs: 13,
sugar: 9,
fiber: 0.2,
fat: 0.1
},
}
Использование
Вот возможный сценарий для проверки ваших функций:
Значение каждого товара в GroceriesCart — это количество граммов

Код: Выделить всё

const groceriesCart = {
orange: 500,
oil: 20,
sugar: 480
}
console.log('Total calories:')
console.log(totalCalories(groceriesCart))
console.log('Items with low carbs:')
console.log(lowCarbs(groceriesCart))
console.log('Total cart nutritional facts:')
console.log(cartTotal(groceriesCart))
И его вывод:

Код: Выделить всё

Total calories:
2112.2
Items with low carbs:
{
oil: 20
}
Total cart nutritional facts:
{
orange: {
calories: 245,
protein: 4.5,
carbs: 65,
sugar: 45,
fiber: 1,
fat: 0.5
},
oil: {
calories: 9.6,
protein: 0,
carbs: 0,
sugar: 24.6,
fiber: 0,
fat: 30.2
},
sugar: {
calories: 1857.6,
protein: 0,
carbs: 480,
sugar: 480,
fiber: 0,
fat: 0
}
}
Понятия
  • фильтр
  • карта
  • сокращение
  • записей
  • из записей
Мой код:

Код: Выделить всё

function filterEntries(obj, callback) {
return Object.fromEntries(
Object.entries(obj).filter(([k, v]) => callback([k, v]))
);
}

function mapEntries(obj, callback) {
return Object.fromEntries(
Object.entries(obj).map(([k, v]) => callback([k, v]))
);
}

function reduceEntries(obj, callback, initial) {
const entries = Object.entries(obj);
let acc = initial;
if (acc === undefined) {
if (entries.length === 0)
throw new TypeError("Reduce of empty object with no initial value");
acc = entries[0];
for (let i = 1; i < entries.length; i++) {
acc = callback(acc, entries[i]);
}
} else {
for (let i = 0; i < entries.length; i++) {
acc = callback(acc, entries[i]);
}
}
return acc;
}

// Helper: truncate to 2 decimals (never round up!)
function strictDecimal(num, d) {
return Math.floor(num * Math.pow(10, d)) / Math.pow(10, d);
}

function totalCalories(cart) {
return (
Math.round(
reduceEntries(
cart,
(acc, [k, amount]) => acc + (nutritionDB[k].calories * amount) / 100,
0
) * 10
) / 10
);
}

function lowCarbs(cart) {
return filterEntries(
cart,
([k, amount]) => (nutritionDB[k].carbs * amount) / 100 < 50
);
}

function cartTotal(cart) {
return mapEntries(cart, ([k, amount]) =>  {
const nut = nutritionDB[k];
const factor = amount / 100;
const result = {};
for (const key in nut) {
if (Object.hasOwn(nut, key)) {
result[key] = strictDecimal(nut[key] * factor, 2);
}
}
return [k, result];
});
}

// // --- Exports for 01Edu tests ---
// export {
//   filterEntries,
//   mapEntries,
//   reduceEntries,
//   totalCalories,
//   lowCarbs,
//   cartTotal,
// };
Отзыв о сбое системы:
manipulate-entrieserror
Ошибка: уже произошел сбой кода при фиксации 90926be Предыдущий результат: тест №9 не пройден: ({ eq, ctx }) => eq(cartTotal(ctx.groceriesCart1), ctx.total1) AssertionError [ERR_ASSERTION]: Ожидаемые значения должны быть строго равны: + фактическое - ожидаемое... Пропущенные строки { чеснок: { калории: 327,8, углеводы: 72,6, жир: 1,1, ... клетчатка: 0, + белок: 2,29, - белок: 2,3, сахар: 0 }, перец: { калории: 1353,6, + углеводы: 259,15, + жир: 61,87, - углеводы: 259,152, - жир: 61,872, клетчатка: 0, + белок: 67,87, - белок: 67,872, сахар: 4,8 } } в eq (file:///app/test.mjs:44:3) в файле://manipulate-entries.js:144:20 в runTests (файл:///app/test.mjs:178:9)

Подробнее здесь: https://stackoverflow.com/questions/798 ... ues-i-dont
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»