Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

163
Views
Array contents can't be retrieved (React JS)

I am getting the content in an array and I can see the contents of the array on console.log.

However, the length is 0 and the contents cannot be retrieved with a map. Why is this?

enter image description here

const contents = [] as any[]

useEffect(() => {
  for(const key of Object.keys(fruits)) {
    contents[key as any] = {
      ...fruits[key as any],
      ...vegetables[key as any],
    }
  }
}, [fruits, vegetables, contents])


console.log('contents', contents)
console.log('contents length', contents.length)
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

You can try to have contents in the state instead of exposing it as a variable.

contents will be updated accordingly and correctly whenever fruits or vegetables get updated.

const [contents, setContents] = useState([])

useEffect(() => {
  const updatedContents = [...contents]
  for(const key of Object.keys(fruits)) {
    updatedContents[key as any] = {
      ...fruits[key as any],
      ...vegetables[key as any],
    }
  }
  setState(updatedContents)
}, [fruits, vegetables])


console.log('contents', contents)
console.log('contents length', contents.length)
about 4 years ago · Juan Pablo Isaza Report

0

useEffect executes after each render.

So the order of operations in your example is:

  1. useEffect scheduled to run after render
  2. Rest of the code is executed (including your console.logs, hence you seeing 0 in the console.log)
  3. useEffect executes, updating contents with the data.

In Chrome's dev tools, javascript arrays/objects are displayed by their reference, evaluated lazily. What this means is that if something is added to the array/object later, and if you expand it later than when it was printed, you'll see the new data.

That answers the why.

As a solution, here's what you can do instead:

const [contents, setContents] = useState([]);

useEffect(() => {
  const newContents = [];
  for(const key of Object.keys(fruits)) {
    newContents.push({
      ...fruits[key as any],
      ...vegetables[key as any],
    });
  setContents(newContents);
  }
}, [fruits, vegetables, contents])

console.log('contents length', contents.length);

You'll see the appropriate console log once the state updates.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!