24

Assume there is an object:

const object = {
  'foo': {
    'bar': [1, 2, 3]
  }
}

I need to push 4 to object.foo.bar array.

Right now I'm doing it like this:

const initialState = Immutable.fromJS(object)
const newState = initialState.setIn(
  ['foo', 'bar', object.foo.bar.length],
  4
)
console.log(newState.toJS())

But I don't really like it, since I need to use object.foo.bar.length in the path. In my real example object is nested much deeper, and getting array's length looks very ugly. Is there another, more convenient way?

0

2 Answers 2

41

This should work

initialState.updateIn(['foo', 'bar'], arr => arr.push(4))

References:

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

4 Comments

Great! Thanks a lot!
arr.push is wrong, as it returns the /length/ of the new array. This will result in {foo: { bar: 3}}. You want to use arr.concat
arr.push is correct here but the naming is a little misleading: arr in his example is Immutable's List because OP created the state through Immutable.fromJS. List.push returns a new list with the argument(s) appended, so this does exactly what OP asked.
@PabloCG you're wrong, push here is not a Array.prototype method, but an immutablejs List method, which DOES NOT modify the original object.
9

I'm using seamless-immutable, when I'm adding a new item to array of nested object, I got this error:

The push method cannot be invoked on an Immutable data structure.

My array still has push method, but it doesn't work. The solution is use concat instead, more details on #43:

initialState.updateIn(['foo', 'bar'], arr => arr.concat([4]));

Hope this help!

1 Comment

Same issue here, makes sense since push modifies which isn't possible with immutable data structures.

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.