как динамически строить массив объектов в локальном состоянии - PullRequest
0 голосов
/ 01 апреля 2019

Мне удалось создать массив с именем postArrays , содержащий объекты из нескольких других массивов, но мне нужно загрузить его в локальное состояние, чтобы я мог обновлять его из реквизитов.

Я не знаю, как это упростить. Это действительно потянуло меня, просто чтобы построить нормальный массив, используя push, который изменяет состояние.

Я пробовал несколько вариантов этого, но не могу понять, как это сделать, не изменяя состояния.

state = { postArrays: []} // empty array in state to update

let postArrays = []; // the array that needs pushing to state
if (posts) {
  postArrays = posts.reduce((acc, obj) => {
    if (obj.post_type) {
      if (!acc[obj.post_type.social.name]) {
        acc[obj.post_type.social.name] = [];
      }
      acc[obj.post_type.social.name].push({
        id: obj.id,
        contentType: { value: obj.post_type.id, label: obj.post_type.name },
        date: obj.publication_date,
      });
    }

    return acc;
  }, []);

 if (!this.state.postsLoaded) {
    for (let key in postArrays) {
      this.setState(
        { postArrays: [key.toLocaleLowerCase()]: postArrays[key] },
        this.setState({ postsLoaded: true }),
      );
    }
  }

}

Когда я делаю это

this.setState({postArrays})

Превышена максимальная глубина обновления, и приложение вылетает

Ниже выводится массив

   [  
   {  
      "name":"facebook",
      "options":[  
         {  
            "value":10,
            "label":"Live",
            "id":null
         },
         {  
            "value":6,
            "label":"Photo",
            "id":null
         },
         {  
            "value":8,
            "label":"Story",
            "id":null
         },
         {  
            "value":7,
            "label":"Video",
            "id":null
         }
      ]
   },
   {  
      "name":"instagram",
      "options":[  
         {  
            "value":13,
            "id":null
         },
         {  
            "value":3,
            "label":"Carousel",
            "id":null
         },
         {  
            "value":5,
            "label":"IgTV",
            "id":null
         },
         {  
            "value":12,
            "label":"Live",
            "id":null
         },
         {  
            "value":1,
            "label":"Picture",
            "id":null
         },
         {  
            "value":4,
            "label":"Story",
            "id":null
         },
         {  
            "value":2,
            "label":"Video",
            "id":null
         }
      ]
   },
   {  
      "name":"youtube",
      "options":[  
         {  
            "value":11,
            "label":"Video",
            "id":null
         }
      ]
   }
]

Когда я обновлю его с помощью реквизита, я буду добавлять новые посты, внутри динамически добавляемых вложенных массивов

На данный момент мне удалось добавить следующее внутри локального состояния, но не удалось добавить fieldArrays []

"instagram":[  
  {  
     "id":2,
     "contentType":{  
        "value":1,
        "label":"Picture"
     },
     "date":"2019-03-19T16:16:07Z"
  },
  {  
     "id":155,
     "contentType":{  
        "value":1,
        "label":"Picture"
     },
     "date":"2019-04-01T11:51:31Z"
  }

]

Мне нужно иметь возможность добавлять больше сообщений, не зная, какие ключи будут заранее,

...