Как отфильтровать вложенный массив с настраиваемым ключом в React / Javascript

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

this.state = {
        staff: {
            ReserveCrew:{
                User:[{
                    id:'1',
                    name:'RC-FF-1',
                    user_type:'User',
                    resource:'ReserveCrew'
                },
                {
                    id:'2',
                    name:'RC-FF-2',
                    user_type:'User',
                    resource:'ReserveCrew'
                }],

                Superadmin:[{
                    id:'3',
                    name:'RC-SA-1',
                    user_type:'Superadmin',
                    resource:'ReserveCrew'
                },
                {
                    id:'4',
                    name:'RC-SA-2',
                    user_type:'Superadmin',
                    resource:'ReserveCrew'
                }]
            },

            Crew1:{
                User:[{
                    id:'5',
                    name:'C1-FF-1',
                    user_type:'User',
                    resource:'Crew1'
                },
                {
                    id:'6',
                    name:'C1-FF-2',
                    user_type:'User',
                    resource:'Crew1'
                }],

                Superadmin:[{
                    id:'7',
                    name:'C1-SA-1',
                    user_type:'Superadmin',
                    resource:'Crew1'
                },
                {
                    id:'8',
                    name:'C1-SA-2',
                    user_type:'Superadmin',
                    resource:'Crew1'
                }]
            }
        }
    }

И у меня есть функция для изменения типа пользователя и ресурса конкретного человека с его идентификатором. Я пытаюсь заменить user_type на User и resource на ReserveCrew с id=7 и сохранить с полным значением состояния.

Моя функция handleChangeEvent

handleChangeEvent() {
    let staff = this.state.staff.filter((item) => {
        if (item.id == '7') {
            item.resource = 'ReserveCrew'
            item.user_type = 'User'
        }
        return item;
   });
   this.setState({ ...this.state, staff })
}

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

Просто подсказка React, вам не нужно использовать ...this.state на this.setState, вы можете записать только this.setState({ staff }). React объединит переданный объект с фактическим состоянием.

Gabriel Carneiro 04.06.2018 14:59

Ошибка связана с функцией фильтра, так как состояние представляет собой вложенный массив с настраиваемыми ключами.

Hareesh S 04.06.2018 15:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
71
1

Ответы 1

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

Сначала, когда вы делаете this.state.staff.filter((item) => ......, он будет проходить только через первый слой, поэтому item будет ReserveCrew, а затем Crew1. Поскольку ReserveCrew и Crew1 являются объектами с User и Superadmin, у них нет свойства id. Таким образом, вы должны отфильтровать (пропустить) каждый User и Superadmin для ReserveCrew и Crew1. Это сделает код менее читабельным. На мой взгляд, я бы поместил всех пользователей в массив, поскольку каждый пользователь уже определяет, суперадмин он или нет, и то же самое для ресурса; так например:

this.state = {
    staff: [
        {
            id:'1',
            name:'RC-FF-1',
            user_type:'User',
            resource:'ReserveCrew'
        },
        {
            id:'2',
            name:'RC-FF-2',
            user_type:'User',
            resource:'ReserveCrew'
        },
        {
            id:'3',
            name:'RC-SA-1',
            user_type:'Superadmin',
            resource:'ReserveCrew'
        },
        {
            id:'4',
            name:'RC-SA-2',
            user_type:'Superadmin',
            resource:'ReserveCrew'
        },
        {
            id:'5',
            name:'C1-FF-1',
            user_type:'User',
            resource:'Crew1'
        },
        {
            id:'6',
            name:'C1-FF-2',
            user_type:'User',
            resource:'Crew1'
        },
        {
            id:'7',
            name:'C1-SA-1',
            user_type:'Superadmin',
            resource:'Crew1'
        },
        {
            id:'8',
            name:'C1-SA-2',
            user_type:'Superadmin',
            resource:'Crew1'
        }
    ]
}

теперь, если вы хотите сменить пользователя, вы можете отфильтровать this.state.staff с той же функцией handleChangeEvent(), что и у вас.

Надеюсь, вы понимаете мой ломаный английский :)

Другие вопросы по теме