Из JS во вложенные упорядоченные карты с Immutable.js?
У кого-нибудь есть предложения по наилучшему способу глубокого преобразования списка списков js во вложенные упорядоченные карты с помощью Immutable.js?
4 ответа
Вы можете создать свое собственное преобразование. Например, чтобы превратить объекты JS в Immutable.OrderedMap
:
function fromJSOrdered(js) {
return typeof js !== 'object' || js === null ? js :
Array.isArray(js) ?
Immutable.Seq(js).map(fromJSOrdered).toList() :
Immutable.Seq(js).map(fromJSOrdered).toOrderedMap();
}
В fromJS
имеет второй параметр, называемый reviver, который можно использовать именно для этого.
import Immutable from 'immutable';
const reviver = (key, value) =>
Immutable.Iterable.isKeyed(value) ? value.toOrderedMap() : value.toList();
const data = Immutable.fromJS(js, reviver);
У ответа @Albert Olivé были проблемы с использованием моего случая из-за рекурсии и отсутствия основного контекста. Я попытался со вторым контекстным аргументом для сопоставления, с проблемами снова. Наконец, я понял, что мне не важен порядок в подкартах, только в основной карте, переданной функции, для поддержания порядка, предоставленного сервером в html-списках. Таким образом, я изменил функцию на рекурсивную таким образом:
fromJSOrdered(js) {
if (typeof js !== 'object' || js === null || Array.isArray(js)) {
return fromJS(js);
}
return new OrderedMap(fromJS(js));
}
Недавно я опубликовал пакет, который может преобразовывать объект, массив или
Map
объектов в неизменяемые
List
х и х:
https://github.com/jhukdev/неизменяемый-парсейс
Вы можете взглянуть на источник, если вы не хотите, легко изменить.
Record
Тем не менее, это хорошо, поскольку у вас есть прямой доступ к свойствам, а это означает, что в будущем, если вы захотите отказаться от ImmutableJs, это более легкая перспектива.