Skip to content

Указатели

Andrey edited this page Aug 30, 2017 · 7 revisions

Помимо итеративных методов работы с коллекциями 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