6

I have this initialState in my Redux store:

const initialState = {
  isFetching : false,
  active     : {}
}

Where active is an object.

Now I have an action that should append or add a property to active’s data property, like so:

[DASHBOARD_TEMPLATE_DATA_RECEIVE]: (state, action) => {
    return Object.assign({}, state, {
      isFetching   : false,
      active       : Object.assign({}, active, {data[action.key]: action.data})
    })
}

As you can see, data[action.key] is not permitted. How do I do it?

Sebastian Simon
  • 18,263
  • 7
  • 55
  • 75
Joey Hipolito
  • 3,108
  • 11
  • 44
  • 83

3 Answers3

8

Try with this:

active: Object.assign({}, active, {
  data: Object.assign({}, data, {
    [action.key]: action.data
  })
})
Iso
  • 3,148
  • 23
  • 31
1

Build the object up first, making use of square bracket notation to use a string as a property name:

var data = {};
data[action.key] = action.data;

then use that newly created object:

[DASHBOARD_TEMPLATE_DATA_RECEIVE]: (state, action) => {
    return Object.assign({}, state, {
      isFetching   : false,
      active       : Object.assign({}, active, data)
    })
}
Jamiec
  • 133,658
  • 13
  • 134
  • 193
  • I think it should be: `active : Object.assign({}, active, { data })` – Joey Hipolito Jul 14 '16 at 11:18
  • @JoeyHipolito, perhaps if that is something specific to Redux, for which im not familiar. But in vanilla javascript, `data` is already an object, so no need to surrpound it with `{}`. – Jamiec Jul 14 '16 at 11:19
  • In-fact, ```data[action.key] = action.data;``` was way helpful if we want to add multiple nodes before hand. Thanks @Jamiec – PravyNandas Jan 20 '20 at 23:20
1

I would guess a computed property name might work.

Untested:

active: Object.assign({}, active, {[data[action.key]]: action.data})
Ben Aston
  • 53,718
  • 65
  • 205
  • 331