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

#reactjs #immutability #immutable.js #immutability-helper

#reactjs #неизменность #immutable.js #помощник неизменности

Вопрос:

Чтобы обновить вложенные данные с помощью помощника по неизменяемости, вы обычно жестко задаете путь к данным, которые хотите обновить, иногда с переменными для ключей. Что вы делаете, если количество ключей / индексов (то есть глубина вложенности) также является переменной? Я ищу способ обновления данных с учетом произвольно длинного списка ключей. Учитывая [0, 1, 1] , я хочу обновить data[0][1][1] , или учитывая [9] , я хотел бы обновить data[9] .

Контекст: у меня есть глубоко вложенный массив комментариев, где вложенный комментарий является ответом на его родительский элемент, и мне нужно добавлять / удалять / редактировать комментарии, в зависимости от того, какой комментарий выбран.

Это выглядит так Immutable.js имеет методы, которые работают именно так, как я описываю:

Неизменяемый.Методы get() или getIn() в JS … [доступ] к свойствам через массив строк, каждая из которых представляет ключ свойства.

https://redux.js.org/recipes/using-immutablejs-with-redux#difficult-to-interoperate-with

Есть ли хороший способ сделать это с помощью immutability-helper? Если нет, то мне еще не поздно переключиться на Immutable.js .

Ответ №1:

Помощники можно использовать для произвольных объектов, а не только для неизменяемых. К ним относятся getIn , setIn , и updateIn :

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

 const { getIn } = require('immutable');

const myDynamicPath = [0, 1, 1];
getIn({ 1: { 2: { 3: 123 }}}, [1, 2, '3'], 'ifNotSet') // 123
 

PS: Будьте осторожны при использовании чисел в качестве ключей, поскольку они всегда являются строками для объектов. С другой стороны, ImmutableJS (и собственная карта / набор) могут работать с произвольными типами в ключах и, следовательно, являются строгими по типу при использовании в коллекциях ImmutableJS. Поэтому, если вы когда-нибудь преобразуете этот объект данных в неизменяемый, у вас могут быть запутанные результаты, если вы не обратите внимания.