Из 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, это более легкая перспектива.

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