Reputation:
I need to write a function, allCandyOrders(inventory), that returns an order object (I'm not sure what that means). The keys should be the names of the candies, and the values should be the amounts to be ordered. If the stock is greater than weekly average, order 0 if the stock is less than weekly average, order 2 times the average.
Example output:
{
"Twizzlers": 400,
"Sour Patch Kids": 200,
"Milk Duds": 0,
"Now and Laters": 0
}
Given array:
let inventory = [
{ candy: "Twizzlers", inStock: 180, weeklyAverage: 200 },
{ candy: "Sour Patch Kids", inStock: 90, weeklyAverage: 100 },
{ candy: "Milk Duds", inStock: 300, weeklyAverage: 170 },
{ candy: "Now and Laters", inStock: 150, weeklyAverage: 40 }
];
What I have so far:
function allCandyOrders(inventory) {
for (let i = 0; i < inventory.length; i++) {
if (inventory[i].inStock < inventory[i].weeklyAverage) {
return inventory[i].weeklyAverage * 2;
} else {
return 0;
}
}
return 0;
}
Upvotes: 0
Views: 1365
Reputation: 22355
Array reduce is correct
let inventory =
[ { candy: 'Twizzlers', inStock: 180, weeklyAverage: 200 }
, { candy: 'Sour Patch Kids', inStock: 90, weeklyAverage: 100 }
, { candy: 'Milk Duds', inStock: 300, weeklyAverage: 170 }
, { candy: 'Now and Laters', inStock: 150, weeklyAverage: 40 }
]
const allCandyOrders = arr => arr.reduce((r,c)=>
{
r[c.candy] = c.inStock < c.weeklyAverage ? c.weeklyAverage *2 : 0
return r
},{})
console.log ( allCandyOrders(inventory) )
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 1
Reputation: 10204
You should make a new object that will store the result you want and put values there inside allCandyOrders
function.
let inventory = [
{ candy: "Twizzlers", inStock: 180, weeklyAverage: 200 },
{ candy: "Sour Patch Kids", inStock: 90, weeklyAverage: 100 },
{ candy: "Milk Duds", inStock: 300, weeklyAverage: 170 },
{ candy: "Now and Laters", inStock: 150, weeklyAverage: 40 }
];
function allCandyOrders(inventory) {
const result = {};
for (let i = 0; i < inventory.length; i ++) {
if (inventory[i].inStock < inventory[i].weeklyAverage) {
result[inventory[i].candy] = inventory[i].weeklyAverage * 2;
} else {
result[inventory[i].candy] = 0;
}
}
return result;
}
console.log(allCandyOrders(inventory));
Simply, you can use Array.reduce
let inventory = [
{ candy: "Twizzlers", inStock: 180, weeklyAverage: 200 },
{ candy: "Sour Patch Kids", inStock: 90, weeklyAverage: 100 },
{ candy: "Milk Duds", inStock: 300, weeklyAverage: 170 },
{ candy: "Now and Laters", inStock: 150, weeklyAverage: 40 }
];
function allCandyOrders(inventory) {
return inventory.reduce((acc, cur) => {
if (cur.inStock < cur.weeklyAverage) {
acc[cur.candy] = cur.weeklyAverage * 2;
} else {
acc[cur.candy] = 0;
}
return acc;
}, {});
}
console.log(allCandyOrders(inventory));
Upvotes: 1
Reputation: 371019
When you have an array for which each array item needs to be transformed into a key-value pair in an object somehow, the most elegant method to use is Object.fromEntries
. That lets you use return
like you're trying to do, except you need to return an entry (key-value pair) rather than just a value:
const inventory = [
{ candy: "Twizzlers", inStock: 180, weeklyAverage: 200 },
{ candy: "Sour Patch Kids", inStock: 90, weeklyAverage: 100 },
{ candy: "Milk Duds", inStock: 300, weeklyAverage: 170 },
{ candy: "Now and Laters", inStock: 150, weeklyAverage: 40 }
];
const order = Object.fromEntries(
inventory.map(({ candy, inStock, weeklyAverage }) => [
candy,
inStock > weeklyAverage ? 0 : weeklyAverage * 2
])
);
console.log(order);
Upvotes: 1