Указатели
Помимо итеративных методов работы с коллекциями Collection поддерживает работу с указателями. Указатель — это универсальный способ получить значение объекта по заданному пути без перебора.
const obj = {foo: {bar: 1}};
// Получим значение напрямую
obj.foo.bar
// Получение свойства по указателю Collection
$C(obj).get('foo.bar') // 1
Указатели поддерживаются рядом методов Collection в виде перегрузок, например, get.
Массив — это универсальная форма указателей, которая подойдёт для работы с любым типом коллекций, например, Map, Set или Object.
const obj = new Map([
[
Infinity,
[{a: 1}]
]
]);
$C(obj).get([Infinity, 0, 'a']) // 1
Каждый элемент массива является ключом поиска, а сам поиск осуществляется слева направо.
Указатель в виде строки — это специальная «сахарная» форма указателей, где ключи разделяются символом .
(по аналогии с точечной нотацией объектов JS). Такая форма удобна для работы с массивами или объектами, но проблематична при использовании с коллекциями, где ключами являются значения отличные от строки, например, Map или Set.
const obj = {
bar: [
1,
2,
{
'some val': new Map([['box', 2]])
}
]
};
$C(obj).get('bar.2.some val.box') // 2
Простой указатель — это такой указатель, который содержит прямую ссылку на значение ключа, т.е.
$C([0]).get(0) // 1
$C(new Map([[Infinity, 1]])).get(Infinity) // 1
Но такая форма не может быть использована для некоторых типов данных (простой объект, функция или массив), поэтому нужно явно оборачивать значение ключа в массив.
function foo() {}
const obj = new Map([[foo, 1]]);
// При передачи функции метод .get будет переключён в итеративный режим
$C(obj).get(foo)
// Получаем значение по ссылке на функцию
$C(obj).get([foo]) // 1