1

I have an object(array?) called expenses, each expense inside has a description, amount and user(displayName).. I went through the expenses object and got all the unique users (uniqueNames)... now I want to create new objects that contain expenses for just each user.


const uniqueNames = [];
  // Get unique names from my state.expenses
  state.expenses.map((expense) => {
    if (uniqueNames.indexOf(expense.displayName) === -1) {
      uniqueNames.push(expense.displayName);
    }
  });

// Unique names now contains 2 names, as expected

// not sure how to do this next part, it outputs nothing and gives me no errors.
  const myExpenses = [];
  uniqueNames.map((name) => {
    state.expenses
      .filter((expense) => {
        expense.displayName.includes(name);
      })
      .map((expense) => {
        myExpenses.push(expense.description);
      });
  });
  console.log("unique names", uniqueNames);
// unique names contains my 2 names of users found in the expense array

  console.log("my expenses by names", myExpenses);
// myExpenses is empty ?
0

1 Answer 1

1

Look at the following :

First we use the Set utility class to create an array of unique user names.

Then, we loop on the uniqueNames in order to create a new array using map, and build up the expenses for each user using reduce, to do the sum of every amounts.

const state = {
  expenses: [{
    displayName: 'foo',
    description: 'snake',
    amount: 5,
  }, {
    displayName: 'bar',
    description: 'cat',
    amount: 2,
  }, {
    displayName: 'bar',
    description: 'dog',
    amount: 8,
  }],
};

const uniqueNames = Array.from(state.expenses.reduce((tmp, {
  displayName,
}) => tmp.add(displayName), new Set()));

console.log('The unique names', uniqueNames);

const expenses = uniqueNames.map(x => ({
  name: x,

  expense: state.expenses.reduce((tmp, {
    displayName,
    amount,
  }) => displayName === x ? tmp + amount : tmp, 0),
}))

console.log('My expenses by names', expenses);

Sign up to request clarification or add additional context in comments.

1 Comment

That worked freaking perfectly. THANK YOU SO MUCH!! :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.