Подтвердить что ты не робот

В чем разница между ImmutableJS Map() и от JS()?

var a = {address: {postcode: 5085}}

var b = Immutable.fromJS(a)
var c = b.setIn(['address', 'suburb'], 'broadview').toJS(); // no error
console.log(c); 

var d = Immutable.Map(a);
var e = d.setIn(['address', 'suburb'], 'broadview').toJS(); // error invalid keyPath(…)

Может кто-то объяснить разницу.

Спасибо,

4b9b3361

Ответ 1

В этом примере

var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);

Здесь d.get('address') является неизменным. Это значение не может измениться на любые другие объекты. Мы можем только создать новый объект из существующего объекта с помощью функции Immutable.Map.set() ImmutableJS.

Но объект , на который ссылается d.get('address') i.e, {postcode:5085}, является стандартным объектом JavaScript. Он изменен. Подобное утверждение может изменить значение postcode:

d.get('address').postcode=6000;

Если вы снова проверите значение d, вы увидите, что он был изменен.

console.log(JSON.stringify(d));   //Outputs {"address":{"postcode":6000}}

что противоречит принципам неизменности.

Причина в том, что структуры данных ImmutableJS, такие как List и Map, придают функции неизменности только элементам уровня 1 List/Map.

Итак, , если у вас есть объекты внутри массивов или массивов внутри объектов и хотите, чтобы они тоже были неизменными, ваш выбор Immutable.fromJS.

var a = {address: {postcode: 5085}}
var b = Immutable.fromJS(a);
b.get('address').postcode=6000;
console.log(JSON.stringify(b));   //Outputs {"address":{"postcode":5085}}

Из приведенного выше примера вы можете четко знать, как fromJS делает вложенные члены неизменяемыми.

Надеюсь, вы поняли разницу между Map и fromJS. Все самое лучшее =)

Ответ 2

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

В вашем втором примере address - простой объект, а не объект ImmutableJS, поэтому вы не можете использовать setIn для изменения его значения.