npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@withinnode/dotnot

v1.0.1

Published

Dot notation getter and setter

Downloads

9

Readme

ДотНот - Геттер и сеттер по точечной нотации

RU | EN

ДотНот (не путать с .NET) - это JavaScript-библиотека, призванная облегчить доступ к глубоко вложенным свойствам объектов, используя для этого точечную нотацию. Библиотека полностью совместима с Node.js и браузерами. Производительность оптимизирована для v8, но на других движках код тоже должен работать довольно быстро.

Идея в следующем:

// Подключаем библиотеку удобным способом
const { get } = await import('https://unpkg.com/@withinnode/[email protected]/lib/index.js');

// Получаем значение приоритетного языка браузера
get(window, 'navigator.languages[0]'); // ru

Установка

Поставляемый пакет не имеет рантайм-зависимостей, поэтому для использования в продакшене рекомендуется устанавливать его без зависимостей для разработки:

npm install --omit=dev @withinnode/dotnot

Если же вы планируете запускать бенчмарки для самостоятельной проверки производительности, то вам понадобится установить пакет со всеми зависимостями:

npm install @withinnode/dotnot

Использование

ДотНот поддерживает два формата путей: стандартный для JavaScript синтаксис property accessors с точками и квадратными скобками, и синтаксис, состоящий только из точек.

// Можно импортировать get или set отдельно или вместе
import { get, set } from 'dotnot';

// Объект для примера
const obj = {
  foo: {
    bar: ['baz', { qux: 42 }]
  }
};

// Получаем значения, используя стандартный синтаксис
get(obj, 'foo.bar[0]'); // baz
get(obj, 'foo.bar[1].qux'); // 42

// Устанавливаем новые значения свойствам
set(obj, 'foo.bar[0]', 'zab');
set(obj, 'foo.bar[1].qux', 24);

// Получаем значения используя синтаксис только с точками
get(obj, 'foo.bar.0'); // zab
get(obj, 'foo.bar.1.qux'); // 24

API

ES Module

Модуль dotnot содержит два именованных экспорта - get и set, а так же экспорт по умолчанию default в виде объекта с этими свойствами.

Использование импорта по умолчанию:

import dotnot from 'dotnot';

// dotnot.get()
// dotnot.set()

Использование импорта по именам:

import { get, set } from 'dotnot';

// get()
// set()

get(obj: object, path: string, defaultValue?: any): any

Функция get - это геттер, который используется для получения значения свойства объекта по пути к этому свойству.

Аргументы:

  • obj: object - Целевой объект
  • path: string - Путь к свойству
  • defaultValue: any - Значение, возвращаемое, если запрошенное свойство не установлено

Возвращает:

  • Значение найденного свойства или значение по умолчанию (если передано) или undefined, если свойство не было найдено.

set(obj: object, path: string, value: any): object

Функция set - это сеттер, который используется для присвоения свойству объекта значения по пути к этому свойству.

Аргументы:

  • obj: object - Целевой объект
  • path: string - Путь к свойству
  • value: any - Новое значение

Возвращает:

  • Сссылку на переданный объект, который был изменен, или undefined, если свойство не было найдено.

Производительность

Для получения репрезентативных бенчмарков, при сравнении используются только пакеты, которые поддерживают полный синтаксис JS-аксессоров с точками для свойств объектов и квадратными скобками для индексов массивов. Синтаксис только с точками не является приоритетным для этой библиотеки, не смотря на то, что он может быть написан значительно производительнее.

Сравнение с основными конкурентами:

Benchmarking getters...
dotnot/get x 1,616,082 ops/sec ±0.17% (99 runs sampled)
lodash.get x 414,361 ops/sec ±0.10% (98 runs sampled)
dot-prop/getProperty x 385,361 ops/sec ±0.17% (98 runs sampled)
dot-object/pick x 528,419 ops/sec ±0.09% (94 runs sampled)
resolve-dotstringkey x 377,465 ops/sec ±0.37% (98 runs sampled)
keypather/get x 185,867 ops/sec ±0.10% (97 runs sampled)
mpath/get x 564,499 ops/sec ±0.14% (95 runs sampled)
Fastest is dotnot/get

Benchmarking setters...
dotnot/set x 1,338,293 ops/sec ±0.13% (97 runs sampled)
lodash.set x 348,360 ops/sec ±0.43% (96 runs sampled)
dot-prop/SetProperty x 408,039 ops/sec ±0.07% (99 runs sampled)
keypather/set x 179,563 ops/sec ±0.33% (99 runs sampled)
mpath/set x 546,170 ops/sec ±0.08% (95 runs sampled)
Fastest is dotnot/set

Стоит заметить, что в этих бенчмарках на функции get и set из библиотеки lodash наложены патчи, которые отключают мемоизацию результатов path resolver'а, т.к. нам абсолютно неинтересно тестировать производительность кеша. Если же вам по каким-то причинам это интересно, то вот результаты бенчмарков, где ДотНоту добавлена мемоизация из lodash:

Benchmarking getters...
dotnot/get x 9,821,512 ops/sec ±0.14% (97 runs sampled)
lodash.get x 5,354,197 ops/sec ±0.56% (96 runs sampled)
Fastest is dotnot/get

Benchmarking setters...
dotnot/set x 4,363,587 ops/sec ±0.25% (98 runs sampled)
lodash.set x 2,021,528 ops/sec ±0.26% (98 runs sampled)
Fastest is dotnot/get

Почему ДотНот все равно в два раза быстрее? Потому что помимо логики разрешения пути требуется выполнить еще получение свойств, и, хотя для этого нужен всего один цикл, но он все равно оптимизирован лучше в ДотНот.

Разработка

Код данной библиотеки написан с упором на производительность при исполнении движком v8, который поставляется с Node.js по умолчанию. При оптимизации активно использовался анализ байткода и ассемблерных инструкций, генерируемых интерпретатором и компиляторами v8 для платформы x86-64. Другие движки и платформы в настоящий момент не являются значимыми для проекта и целенаправленно оптимизация для них при разработке не проводится.

Лицензия

Это программное обеспечение распространяется под лицензией MIT и может свободно использоваться в личных или коммерческих проектах.