Упражнение:
Инструкции
Создайте 3 функции, которые работают как методы массива .filter, .map и .reduce, но для записей в корзине покупок.
- : фильтрует, используя как ключ, так и значение, передаваемое в виде массива (
Код: Выделить всё
filterEntries).Код: Выделить всё
[k, v] - : изменяет ключ, значение или и то, и другое, передаваемое в виде массива (
Код: Выделить всё
mapEntries).Код: Выделить всё
[k, v] - : уменьшает количество записей, передающих ключи и значения в виде массива (
Код: Выделить всё
reduceEntries).Код: Выделить всё
[k, v]
- : возвращает общее количество калорий в корзине.
Код: Выделить всё
totalCalories - : после расчета общего количества в корзине остаются только те позиции, которые содержат менее 50 граммов углеводов.
Код: Выделить всё
lowCarbs - : это даст вам необходимое количество калорий, белков и т. д. для каждого товара в вашей продуктовой корзине.
Код: Выделить всё
cartTotal
Предоставленный код
Предоставленный код будет добавлен в ваше решение, и его не нужно отправлять.
Код: Выделить всё
// 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