Позволяет ли immutablejs выполнять поиск по ссылочному типу

#javascript #immutable.js

#язык JavaScript #immutable.js

Вопрос:

У меня есть фрагмент кода, который выглядит так

 const { Map } = require('immutable@4.0.0')  let map = new Map().setIn(["user",["alex","country"]],"Poland") map.getIn(["user",["alex","country"])  

Я надеюсь , что все вышесказанное вернется "Poland" , но это не так. Я предполагаю , что ссылочный тип ["alex", "country"] сериализуется по-разному при настройке и запросе. Любая помощь в том, как этого добиться, была бы полезной. Я уклоняюсь от необходимости обрабатывать сериализацию массива вручную

Комментарии:

1. Это ваш настоящий код? map.getIn(["user",["alex","country"]) содержит опечатку.

Ответ №1:

Массив не сериализуется. immutable использует фактический объект (его ссылку) в качестве ключа и оператор равенства для сравнения ключей. Это означает, что первый ["alex","country"] и второй ["alex","country"] — два разных ключа.

Этот фрагмент показывает проблему:

 if (['alex', 'country'] !== ['alex', 'country']) {  console.log('The references are different'); } 

У меня есть 3 решения:

1. Сохраните ссылку в переменной

Вы можете сохранить ссылку на массив в переменной, чтобы использовать ее в качестве ключа:

 const { Map } = require('immutable');  const arr = ['alex', 'country']; let map = new Map().setIn(['user', arr], 'Poland'); console.log(map.getIn(['user', arr]));  

2. Сериализуйте массив с помощью toString

Альтернативным решением является сериализация массивов с использованием toString :

 const { Map } = require('immutable@4.0.0')  let map = new Map().setIn(["user",["alex","country"].toString()],"Poland") map.getIn(["user",["alex","country"].toString()])  

Пример фрагмента:

 if (['alex', 'country'].toString() === ['alex', 'country'].toString()) {  console.log('The serialized arrays are equal'); } 

Но помните, что сериализация разных массивов может привести к одной и той же строке:

 if (['alex', 'country'].toString() === ['alex,country'].toString()) {  console.log('Serializing different arrays can yield the same string'); } 

3. Выровняйте массив

Другой подход заключается в выравнивании массива путей:

 const { Map } = require('immutable');  let map = new Map().setIn(['user', ['alex', 'country']].flat(), 'Poland'); console.log(map.getIn(['user', ['alex', 'country']].flat()));  

Комментарии:

1. Это сработало бы, если бы константа arr = [«алекс», «страна»] всегда была составлена и ссылалась в одном и том же контексте

2. @Ndifreke В этом случае вы не можете использовать непримитивы в качестве ключа. immutable не сериализует объекты.

3. выравнивание массива-это именно то, что мне нужно, спасибо

4. 4. Сделайте ключ примитивом, который можно воспроизвести в любое время: ['alex','country'].join()

5. @dube В чем разница между 4. ['alex','country'].join() и 2. ["alex","country"].toString() ?