Добавьте новый массив к объекту

#javascript #arrays #reactjs #use-state #context-api

Вопрос:

Я использую контекстный api для управления состоянием, я установил начальное состояние для студентов: null и теги: [] студенты-это массив объектов с такими данными:

 [
{
 "id": 1,
 "city": "some city",
 "name" : "some name",
 "colors" : [
             "1": "blue",
             "2" : "red"
            ],
 "age": "some age"
},
{
 "id": 2,
 "city": "some city",
 "name" : "some name",
 "colors" : [
             "1": "green",
             "2" : "yellow"
            ],
 "age": "some age"
}
]
 

Массив тегов будет выглядеть следующим образом

 {
 "studentId": 1,
 "tag": "some tag",
},
{
 "studentId": 2,
 "tag": "some tag",
},
{
 "studentId": 2,
 "tag": "some tag",
},
]

 

Теперь я хочу добавить объекты в массив тегов к соответствующим объектам в массиве учащихся.
например, у студента с номером удостоверения личности 2 есть две метки с его удостоверением личности. я хочу, чтобы массив тегов с идентификатором StudentID 2 был добавлен в качестве массива к объекту student с этим конкретным идентификатором..Не знаю, есть ли во мне смысл.

Мое государственное досье

  const addTag = async tag => {

    try {

        dispatch({ 
            type: ADD_TAG, 
            payload: tag
           })
    } catch (error) {
        dispatch({ 
            type: STUDENT_ERROR ,
            payload: error
           })
    }
}
 

Мой редуктор

  case ADD_TAG:
            return {
                ...state,
                
                tags: [...state.tags, action.payload],
 
            }

 

Я заполняю только состояние теги..но я также хочу сделать это для состояния студенты.
Спасибо

Ответ №1:

Вы можете просто скопировать массив students (чтобы не изменять его напрямую), найти индекс рассматриваемого объекта student, а затем добавить в него теги.

 case ADD_TAG:
   let studentCopies = JSON.parse(JSON.stringify(state.students));
   let index = studentCopies.findIndex(s => s.id === action.payload.studentId);


   if (index > -1) {
      // if student object is in array, then add tag to student's tag array

     if (studentCopies[index].tags) {
       studentCopies[index].tags = [...studentCopies[index].tags, action.payload];
     } else {
        studentCopies[index].tags = [action.payload]
     }
   }  
    

   return {
     ...state,
     students: studentCopies,
     tags: [...state.tags, action.payload]
   }

 

Комментарии:

1. Ошибка типа: studentCopies[индекс].теги не повторяются Ошибка, которую я получаю сейчас

2. О, если у вас нет учеников, с которых можно начать, это имеет смысл

3. Я обновил на примере. Если значение students равно null, то ошибка, которую вы получили, имеет смысл, потому что вы не можете перебирать значение null. Вы хотите иметь возможность добавлять теги до того, как сможете добавлять студентов?

4. я ДУМАЮ, это потому, что внутри массива студентов нет массива тегов.. может ли это быть причиной? Потому что у меня есть students…it даже получает индекс от вашего code..it отлично работает до тех пор, пока studentCopies[индекс].теги = […studentCopies[индекс].теги, действие. полезная нагрузка];

5. позвольте мне попробовать обновленную версию, которую студенты exists..it не равно нулю. но по умолчанию в массиве учащихся нет массива тегов. поэтому я хочу, чтобы после добавления тега в массив учащихся был создан массив тегов, соответствующий идентификатору. Вау, это сработало!