#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()
?