Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 28.08.2019
Сообщений: 62

Обновление массива в объекте

19.01.2023, 18:53. Показов 575. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Как улучшить механизм обновления массива в ReactJS.
Из-за этой конструкции у меня бывают баги с обновлением других данных.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const [data, setData] = useState([
    { description: 'test', dataParam: ['z!SGk$', 'v#76f!'] },
    { description: 'test', dataParam: ['#8!24x', 'H!8#5n'] },
    { description: 'test', dataParam: ['3%b8QJ', '64tbpP'] },
]);
 
const [oldData, setOldData] = useState(['#8!24x', 'H!8#5n']);
 
changeLocalData(['$b62qG', '529y6U']); // передача параметров происходит по событию. (Входные данные)
 
function changeLocalData(arrNewData) {
    let tempData = data;
 
    for (let i = 0; i < tempData.length; i++) {
        if (tempData[i].dataParam[0] === oldData[0] && tempData[i].dataParam[1] === oldData[1]) {
            tempData[i].dataParam = arrNewData;
            break;
        }
    }
    setData(tempData);
}
Я пыталась так сделать...
JavaScript
1
2
3
4
5
6
7
8
9
10
    for (let i = 0; i < tempData.length; i++) {
        if (tempData[i].dataParam[0] === oldData[0] && tempData[i].dataParam[1] === oldData[1]) {
            /* Пример 1 */
            tempData[i].length = arrNewData;
            setData(tempData);
            /* Пример 2 */
             setData({...tempData[i].dataParam, arrNewData});
            break;
        }
    }
Но у меня не получилось сделать адекватно эту функцию.
Спасибо заранее!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.01.2023, 18:53
Ответы с готовыми решениями:

Как отключить автоматическое обновление текстуры на 3D объекте?
Есть два открытых файла в Photoshop. 1) 3D Объект 2) Его текстура При редактирование текстуры ,тут-же обновляется на модели. ...

Хранение массива объектов в COM-объекте
в общем такая у меня проблема: есть Automation Server. в нем массив объектов. я хочу предусмотреть в интерфейсе функцию, дающую...

Изменение данных в объекте массива
Добрый день! Задача такова: есть массив. Необходимо создать функцию с параметрами index и arg1 (где index - индекс массива, а arg1 -...

3
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
19.01.2023, 19:22
Лучший ответ Сообщение было отмечено Викуся96 как решение

Решение

Цитата Сообщение от Викуся96 Посмотреть сообщение
JavaScript
1
let tempData = data;
Какой сакраментальный смысл в этом действии?

Добавлено через 3 минуты
Цитата Сообщение от Викуся96 Посмотреть сообщение
JavaScript
1
setData({...tempData[i].dataParam, arrNewData});
Делать в цикле такие вызовы совсем не имеет смысла. Т.к. изменение стейта суть асинхронное действо. Т.о., при явном указании значении стейта, стейту просто присвоится последнее изменение.

P.S.
И опять этот tempData...

Добавлено через 2 минуты
Цитата Сообщение от Викуся96 Посмотреть сообщение
Но у меня не получилось сделать адекватно эту функцию.
Тебе нужно в итоге создать новый массив и вот его нужно записать в стейт.

Добавлено через 9 минут
Что-то типа такого...
JavaScript
1
2
3
4
5
6
function changeLocalData(arr) {
    const a = data.map(o => {
        return o.every((v, j) => v === oldData[j]) ? {...o, dataParam: arr} : o
    });
    setData(a);
}
2
1 / 1 / 0
Регистрация: 28.08.2019
Сообщений: 62
20.01.2023, 10:43  [ТС]
Сработал такой вариант . Только как сделать для вложенного массива?
Логика работы такая, но данные выглядят следующим образом:
JavaScript
1
2
3
4
5
6
7
8
9
const [data2, setData2] = useState([
    { description: 'test', dataParam: [ ['z!SGk$', 'v#76f!'],  ['Jd^3l1', 'lc#ew1'], ...] },
    { description: 'test', dataParam: [ ['#8!24x', 'H!8#5n'], ['3%b8QJ', '64tbpP'] ] },
    ...,
]);
 
const [oldData, setOldData] = useState(['#8!24x', 'H!8#5n']);
 
changeLocalData(['$b62qG', '529y6U']); // передача параметров происходит по событию. (Входные данные)
Я попробовала через вложенный map но данные вставляются не правильно (((
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
20.01.2023, 11:25
Лучший ответ Сообщение было отмечено Викуся96 как решение

Решение

Викуся96, вот такой тестик я сваял...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
const [data2, setData2] = useState([
    { description: 'test', dataParam: [ ['z!SGk$', 'v#76f!'],  ['Jd^3l1', 'lc#ew1'] ] },
    { description: 'test', dataParam: [ ['#8!24x', 'H!8#5n'], ['3%b8QJ', '64tbpP'] ] }
]);
 
const [oldData, setOldData] = useState(['#8!24x', 'H!8#5n']);
*/
 
const data2 = [
    { description: 'test', dataParam: [ ['z!SGk$', 'v#76f!'],  ['Jd^3l1', 'lc#ew1'] ] },
    { description: 'test', dataParam: [ ['#8!24x', 'H!8#5n'], ['3%b8QJ', '64tbpP'] ] }
];
 
const oldData = ['#8!24x', 'H!8#5n'];
 
 
changeLocalData(['$b62qG', '529y6U']);
 
//
function changeLocalData(arr) {
    const an = data2.map(o => {
        const i = o.dataParam.findIndex(a => a.every((v, i) => v === oldData[i]))
        if (i === -1) return o
        return {...o, dataParam: o.dataParam.map((a, j) => j === i ? arr : a)}
    })
    console.log(an)
    // setData2(an)
    return an
}
Суть его такая - тебе нужно сделать новые ссылки на все меняющиеся массивы и объекты.
Я закомментировал "стейтовую часть", дабы можно было пример просто запустить и посмотреть как оно заменилось...

Добавлено через 11 минут
Вот так будет без "внутреннего" map...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
//
function changeLocalData(arr) {
    const an = data2.map(o => {
        const i = o.dataParam.findIndex(a => a.every((v, i) => v === oldData[i]))
        if (i === -1) return o
        const a = [...o.dataParam]
        a.splice(i, 1, arr)
        return {...o, dataParam: a}
    })
    console.log(an)
    // setData2(an)
    return an
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2023, 11:25
Помогаю со студенческими работами здесь

Сменить тип данных в объекте массива
Приветствую, столкнулся наверно с простой проблемой, пытаюсь сменить значение строки на число пробежавшись по всему массиву, у объекта, но...

Prototype Объект в объекте в объекте
Всем здравствуйте! Хотел бы у спросить как оптимально организовать с объектом вида var object1 = { object1: { ...

Поиск информации в объекте массива по фамилии автора
Есть классы: Book, Article, OnlineResource, -- которые наследуются абстрактным классом Edition. Edition array = new...

Добавление информации об объекте в отдельный блок и удаление из него информации о предыдущем объекте
Здравствуйте! Есть карта, созданная с помощью API Яндекс карт. На карте есть метки, при клике на которые в отдельный блок на странице...

Метод для подсчета кол-ва элементов в объекте массива
Есть кнопка, в которой есть условия для ее отображения, условие заключается в количестве элементов product.productArticles Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru