2016-01-03 3 views
1

Я передаю массив неизменному объекту списка. Однако объекты неизменяемого списка изменяются, когда список преобразуется в массив, который затем обновляется.Immutable.js: Как сохранить неизменность при экспорте в массив?

В результате, неизменяемый список по-прежнему изменен, как я могу избежать этого, сохраняя возможность вернуть массив для работы?

Просьба также дать пояснения. Вот некоторые псевдо-код, чтобы проиллюстрировать сценарий:.

var data = [{id:'a'}, {id:'b'}, {id:'c'}]; 
var immutables = Immutable.List(data).asImmutable(); //Immutable list? 

var myData = immutables.toArray(); 
myData[0] = {id:'x'}; //object is updated in immutable list as well 
+0

Используйте записи вместо простого объекта. –

+0

Как насчет 'immutables = Immutable.fromJS (data)' и 'myData = immutables.toJS()'? – mostruash

ответ

0

Имея изменяемых данных внутри неизменных структур почти всегда плохая идея (наоборот он делает гораздо больше смысла). Чтобы этого избежать, используйте Immutable.fromJS (данные) вместо Immutable.List (данные) и Immutable.Map (данные) - так же, как предлагалось @mostruash.

+0

Спасибо, это работает нормально. Я предположил, что данные будут преобразованы в неизменяемые при передаче его в конструктор неизменяемых списков. Бенджамин Груэнбаум упомянул, что использует записи по объектам, в чем преимущество использования записей над объектами? – scripton

+0

Запись - это объект, похожий на карту, с заранее определенным набором ключей: https://facebook.github.io/immutable-js/docs/#/Record. Использование записей приводит к более раннему обнаружению ошибок - если вы устанавливаете атрибут, неизвестный определенной записи, возникает ошибка. Это хорошая концепция, но я не уверен, как она относится к исходному вопросу. –

+0

Вы правы, это не имеет отношения к первому вопросу. Спасибо за объяснение. – scripton