user14385210
user14385210

Reputation:

Given array, write a function that returns an order object

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

Answers (3)

Mister Jojo
Mister Jojo

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

Derek Wang
Derek Wang

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

CertainPerformance
CertainPerformance

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

Related Questions