#javascript #immutable.js
#javascript #immutable.js
Вопрос:
Для меня Immutable.js уменьшает много головной боли, и это отличная библиотека, но теперь я сталкиваюсь с проблемой, мой исходный объект поступает с сервера, но когда я использую любую из его функций, как будто fromJS({myObj})
он работает, но сохраняет копию, но сортируется «от а доя», и я делаю что-то, что нужноисходная структура для хранения компонентов в том порядке, который поступает с сервера, у кого-нибудь есть идеи?
Ответ №1:
fromJS
переводит ваши объекты в lists
и maps
по умолчанию. Первый упорядочен, но не имеет ключа, в то время как последний имеет ключ, но не упорядочен, поэтому ни один из них не подходит для вашего варианта использования.
То, что вы ищете, — это an OrderedMap
, который является a Map
с дополнительной гарантией порядка вставки:
import { OrderedMap } from 'immutable';
const orderedMap = OrderedMap({key: "value"});
Ответ №2:
Вы можете достичь этого, продолжая использовать fromJS
: у него есть второй параметр с именем reviver, который также можно использовать для использования OrderedMaps вместо стандартных карт:
import Immutable from 'immutable';
const reviver = (key, value) =>
Immutable.Iterable.isKeyed(value) ? value.toOrderedMap() : value.toList();
const data = Immutable.fromJS(js, reviver);
Ответ №3:
Основные объекты Javascript явно не предоставляют никаких гарантий относительно порядка ключей. Immutable.Map
(ожидаемый результат вашего fromJS()
вызова) просто следует за этим.
Если вам нужен порядок, вы должны либо указать порядок как другое свойство для каждого элемента, либо, более традиционно, создать Immutable.List
из an Array
.
Другими словами, это звучит как проблема с квадратным колышком / круглым отверстием. Убедитесь, что вы используете правильную структуру данных для своей задачи.
Комментарии:
1. Я попытался использовать неизменяемый. Список и я получили тот же результат, в любом случае, спасибо. Вот пример ссылки
2. @Norman Ваш код близок. Свойства объекта не будут сохранять свой порядок. Если вы хотите, чтобы элементы имели порядок, вам нужно сохранить их в
List
:var myOrderedObj = Immutable.fromJS({ name: 'thing', orderedProps: [{ size: 1}, { weight: 2}] })
. Однако это довольно странная вещь.3. :/ ну, я думаю, я начну что-нибудь с этого 🙂 спасибо, Тревор.
4. Нет проблем. Я знаю, что ответ вроде как неудовлетворительный.
5. Нет, все в порядке, у меня есть какое-то решение, но когда оно будет закончено, я напишу его здесь.