baphomet
baphomet

Reputation: 31

Looping through array of objects is only returning one object of elements instead of two. What am I doing wrong?

Forewarning I am new to coding so be patient with me.

I'm trying to loop through the "diary" array & the function "howMany" is only returning 2 'Home' elements, when there are 4 elements of 'Home' overall in the "diary" array.

Code in question

What am I doing wrong? Thank you. :)

Upvotes: 0

Views: 921

Answers (3)

amlxv
amlxv

Reputation: 2005

You're using the includes method which only returns the boolean. If it's matched, even got 4 matches, the number only will be increased by 1 for each loop.

This is another way to achieve that by using filter.

let diary = [];

const addEntry = (events) => {
  diary.push({ events });
};

addEntry(['Home', 'Work', 'Park', 'Beach', 'Home']);
addEntry(['Work', 'Home', 'Store', 'Gas Station', 'Home']);

const howMany = (event, journal) => {
  let number = 0;

  for (let i = 0; i < journal.length; i++) {
    let entry = journal[i];
    number += entry.events.filter((e) => e === event).length;
  }

  console.log(`You did that ${number} time(s)`);
};

howMany('Home', diary);
console.log(diary);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter


Update: Using reduce & filter.

let diary = [];

const addEntry = (events) => {
  diary.push({ events });
};

addEntry(['Home', 'Work', 'Park', 'Beach', 'Home']);
addEntry(['Work', 'Home', 'Store', 'Gas Station', 'Home']);

const howMany = (event, journal) =>
  journal.reduce(
    (acc, curr) => acc + curr.events.filter((e) => e === event).length,
    0
  );

const number = howMany('Home', diary);

console.log(`You did that ${number} time(s)`);    
console.log(diary);

Upvotes: 2

Ronnel
Ronnel

Reputation: 59

sorry for earlier answer i didnt review the code this is the correct one

let diary = [];

const addEntry = (event) => {
  diary.push(event);
};

addEntry(['Home', 'Work', 'Park', 'Beach', 'Home']);
addEntry(['Work', 'Home', 'Store', 'Gas Station', 'Home']);

const howMany = (event, journal) => {
  let number = 0;

  for (let i = 0; i < journal.length; i++) {
    for(let j =0;j < journal.length;j++) {
    const entries = journal[i][j]
     if(event.includes(event)){
      number++
     }
    }
   
  }

  console.log(`You did that ${number} time(s)`);
};

howMany('Home', diary);
console.log(diary);

Upvotes: 1

Reyhan Farabi
Reyhan Farabi

Reputation: 34

The reason why it returning only two is because includes() method will not count on how many occurrence of it occur, but only return boolean. And your code only count how many true statement is occur. In your case, because the array length is 2 and every element happens to have 'Home', your code only returning 2.

There are multiple way to achieve what you want but what I do below is to use multiple foreach (or you can use for loop as well) kinda like checking 2d array.

let diary = []

const addEntry = events =>{
    diary.push({events})
}

addEntry(['Home', 'Work', 'Park', 'Beach', 'Home'])
addEntry(['Work', 'Home', 'Store', 'Gas Station', 'Home'])

const howMany = (event, journal) => {
    let number = 0;
  journal.forEach(element => {
    element.events.forEach(item => {
      if (item === event) {
        number++
      }
    })
  });
  console.log(`You did that ${number} time(s)`);
}

howMany('Home', diary)
console.log(diary)

*sorry if my english is pretty bad.

Upvotes: 0

Related Questions