0

I was answering a question on here and I figured out how to do it using map() and the spread (...) operator, but I wanted to write it in more of a imperative way. I'll show you (1) what I've written, (2) what I expected to be the outcome, and then (3) the actual outcome.

(1) What I've written:

    const arrayOfObjects = [
        { var1: 1, var2: 2 },
        { var1: 3, var2: 4 },
        { var1: 5, var2: 6 },
        { var1: 7, var2: 8 }
    ]
    
    const newArray = []
    
    const length = arrayOfObjects.length
    
    for (let i = 0; i < length; i++) {
        if (i < (length - 1)) {
            newArray.push(arrayOfObjects[i])
            newArray[i].child = arrayOfObjects[i+1]
        } else {
            newArray.push(arrayOfObjects[i])
        }
    }
    
    console.log(newArray)

(2) So the expected outcome is this:

[ { var1: 1,
    var2: 2,
    child: { var1: 3, var2: 4 } },
  { var1: 3,
    var2: 4,
    child: { var1: 5, var2: 6 } },
  { var1: 5, var2: 6, child: { var1: 7, var2: 8 } },
  { var1: 7, var2: 8 } ]

(3) But the actual outcome is this:

[ { var1: 1,
    var2: 2,
    child: { var1: 3, var2: 4, child: [Object] } },
  { var1: 3,
    var2: 4,
    child: { var1: 5, var2: 6, child: [Object] } },
  { var1: 5, var2: 6, child: { var1: 7, var2: 8 } },
  { var1: 7, var2: 8 } ]

And if you were to inspect the first index of the new array, console.log(newArray[0]) you'll see that it's added a child object all the way down:

{ var1: 1,
  var2: 2,
  child: 
   { var1: 3,
     var2: 4,
     child: { var1: 5, var2: 6, child: [Object] } } }

I feel like I'm missing something very obvious, but I can't for the life of me figure it out! Thanks in advance :)

2
  • 1
    It is because newArray[i].child = arrayOfObjects[i+1] assigns by reference. You need to create a new object and assign it. If you assign by reference, when you change newArray value, arrayOfObjects value changes too and includes child element. Commented Dec 12, 2018 at 12:08
  • Thank you for the explanation :) Commented Dec 12, 2018 at 12:16

1 Answer 1

1

You need to do this

Object are assigned by reference not by value.so in order to assign value you need to create a copy of it and than assign it.

 newArray[i].child = Object.assign({},arrayOfObjects[i+1])

So here Object.assign will create a copy of arrayOfObjects.so now when you assign it will be assigned by value.

const arrayOfObjects = [
    { var1: 1, var2: 2 },
    { var1: 3, var2: 4 },
    { var1: 5, var2: 6 },
    { var1: 7, var2: 8 }
]

const newArray = []

const length = arrayOfObjects.length

for (let i = 0; i < length; i++) {
    if (i < (length - 1)) {
        newArray.push(arrayOfObjects[i])
        newArray[i].child = Object.assign({},arrayOfObjects[i+1])
    } else {
        newArray.push(arrayOfObjects[i])
    }
}

console.log(newArray)

There is one more way to do it using ... operator.

const arrayOfObjects = [
    { var1: 1, var2: 2 },
    { var1: 3, var2: 4 },
    { var1: 5, var2: 6 },
    { var1: 7, var2: 8 }
]

const newArray = []

const length = arrayOfObjects.length

for (let i = 0; i < length; i++) {
    if (i < (length - 1)) {
        newArray.push(arrayOfObjects[i])
        newArray[i].child = {...arrayOfObjects[i]};
    } else {
        newArray.push(arrayOfObjects[i])
    }
}

console.log(newArray)

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

2 Comments

Thank you! This explains a lot.
@JossClassey if it helped you can mark it as correct one :p anyways happy to help :)

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.