1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/janpoem-prop-filter

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

prop-filter — объектный атрибут чтения-записи прокси

prop-filter — это облегчённый, ненавязчивый прокси для фильтрации чтения и записи атрибутов объектов. Он легко интегрируется с любой средой проекта и мгновенно повышает эффективность программирования и улучшает повторное использование кода.

При написании кода на JavaScript часто приходится иметь дело с большим количеством операций чтения и записи объектных атрибутов. Часто требуется создать определённые методы get/set для конкретных диапазонов экземпляров объектов. Эти методы не только делают класс громоздким, но и зачастую оказываются неэффективными, поскольку в реальности используются лишь несколько из них, а остальные остаются невостребованными. В результате возникает вопрос: можно ли сделать методы set/get независимыми модулями или классами для централизованного управления и обновления, не нарушая при этом бизнес-логику исходного класса?

После долгих размышлений и анализа было решено использовать прокси-подход для операций чтения-записи атрибутов (get/set), что привело к созданию библиотеки prop-filter.

Хотя свойства чтения-записи (get/set) можно эффективно реализовать на основе ES Object.definedProperties, такой подход может сделать код менее предсказуемым, и последующие разработчики должны будут тратить больше времени на понимание и отладку кода или полагаться на документацию для объяснения наличия геттеров или сеттеров. Это не способствует повышению наглядности проекта.

Все проекты, опубликованные автором, по умолчанию публикуются в Gitee.

Кроме того, все наследования классов основаны на объектно-ориентированном подходе и не требуют использования прототипов, так что можно сказать «забудьте о прошлом и смотрите в будущее!».

Зависимости проекта

  • deepmerge и lodash.merge: поведение deepmerge было изменено, чтобы соответствовать поведению Object.assign. Однако у deepmerge есть проблема: если deepmerge([], {}), то результат слияния также будет объектом структуры {}, даже если первый параметр является массивом []. В остальном deepmerge соответствует требованиям проекта, поэтому он продолжает использоваться.

  • Lodash: в проекте используются методы _has, _get и _set из Lodash. Эти три метода широко использовались в других проектах, и их применение оказалось очень удобным, поэтому нет необходимости создавать собственные решения.

  • Typechecker: используется для определения типов переменных. Результаты работы этой библиотеки в основном совпадают с результатами встроенного в JavaScript оператора typeof. Существует множество библиотек для определения типов в npm, но многие из них вводят новые настройки, которые требуют времени для понимания и обработки. Это может быть неудобно, особенно когда речь идёт о создании собственных решений.

  • php-trim-plus: собственная библиотека, предназначенная для улучшения обработки строк, проверки пустых символов и усиления функции JavaScript trim.

Упаковка

  • index.js — не объединяет зависимости, использует стиль commonjs для импорта в среду nodejs.

  • PropFilter.js — служит точкой входа для src/PropFilter.mjs, не объединяет зависимости и использует стиль mjs (import / export) для проектов, требующих среды mjs. Методы lodash импортируются с помощью import getProp from "lodash/get".

  • PropFilter.lodash-standalone.js — отличается тем, что напрямую импортирует _ из "lodash", что может быть полезно для проектов, где lodash не объединён с webpack.

  • dist/prop-filter.bundle.js — объединяет все зависимости (с использованием rollup.js) и использует стиль commonjs.

  • dist/prop-filter.bundle.umd.js — объединяет все зависимости (используя rollup.js) и применяет стиль umd, где глобальная переменная называется PropFilter.

  • dist/prop-filter.lodash-standalone.js — lodash используется как отдельный пакет в проекте, требуя require('lodash').

  • dist/prop-filter.lodash-standalone.umd.js — lodash существует как глобальный объект (_), без объединения.

Установка

npm install prop-filter
// or
yarn add prop-filter

Базовый пример использования

Основные три звезды: has, get, set

const Filter = require('prop-filter');

let firstFilter = new Filter({
    key1: {
        /**
         * 对象属性 getter 过滤器
         * @param {*} value 从取值的对象的 key 中所取得到的值
         * @param {{}} data 要取值的对象
         * @param {string} key 要取值的 key
         * @return {*} 返回的结果,为到 filter.get 方法所返回的值。
         */
        get: (value, data, key) => { // getter
            return value; // 返回 get 的值
        },
        /**
         * 对象属性 setter 过滤器
         * @param {*}      value 要向对象的 key 写入的值
         * @param {{}}     data  要写入属性的对象
         * @param {string} key   要写入值的 key
         * @return {*}           返回的结果,为最终要写入到对象属性上的值。
         */
        set: (value, data, key) => { // setter
            return value; // 返回 要写入 的值
        },
        /**
         * 判定对象的某个 key 是否有定义值
         * @param {*}       value 从取值的对象的 key 中所取得到的值
         * @param {boolean} has   判定该值是否存在的初步结果
         * @param {{}}      data  要取值的对象
         * @param {string}  key   要判断值是否存在的 key
         * @return {boolean}      返回的结果,最终输出 filter.has 的 результат。
         */
        has: (value, has, data, key) => { // has
            return has;
        }
    }
});

// 目标对象
let target = {key1: 'value1'};
let anotherTarget = {key1: 'another-value1'};

filter.attach(target); // 将 filter 附着到目标对象上
if (filter.has('key1')) { // exists ?
    let key1Value =
``` **Перевод текста на русский язык:**

**Базовый трёхзвёздочный — особое примечание:**
1. Поскольку используется `_.has` в качестве основы для определения `has`, формируется базовая основа `has`, а lodash `_.has`, в некоторой степени, скорее следует называть existsKey или containKey, то есть его возвращаемый результат основан на том, существует ли этот ключ в целевом объекте, поэтому следующее:

```javascript
let obj = {key: undefined};

_.has(obj, 'key'); // здесь будет возвращено true, потому что это логика existsKey или containKey, а не проверка значения ключа на неопределённость

Поэтому, если речь идёт о применении фильтра, если нужно отфильтровать неопределённые и нулевые значения:

let filter = new Filter({
    key1: {
        has: (value, has, data, key) => {
            if (typeof value === 'undefined' || value === null)
                return false;
            return has;
        }
    }
});
  1. Методы объявления трёхзвёздочного отличаются, стрелочные функции vs function. Стрелочные функции по умолчанию не привязывают контекст this, поэтому, когда вам нужно использовать некоторые встроенные типы фильтров, вы должны чётко понимать разницу между стрелочными функциями и function. Если в стрелочной функции вы хотите сослаться на текущий фильтр, можно добавить параметр в объявление параметра.
let filter1 = new Filter({
    key1: {
        get: (value, data, key, filter) => { 
            // Здесь this не является текущим фильтром, а является глобальным объектом.
            if (filter.isEmptyString(value))
                return "hello world!";
            return value;
        }
    }
});

let filter2 = new Filter({
    key1: {
        get: function(value, data, key) { 
            // Здесь this указывает на фильтр.
            if (this.isEmptyString(value))
                return "hello world!";
            return value;
        }
    }
});

Конечно, вы также можете написать так:

let filter2 = new Filter((filter) => {
    key1: {
        get: (value, data, key) => { 
            // Здесь this указывает на фильтр.
            if (filter.isEmptyString(value))
                return "hello world!";
            return value;
        }
    }
});

Реализация основного тела трёхзвёздочной системы filter

Фактическая реализация трёхзвёздочной системы — это Filter.filter, поэтому, если вам нужен собственный фильтр, пожалуйста, свободно перегружайте этот метод в своём собственном подклассе:

// Реализация 1: предварительная перегрузка
class MyFilter1 extends Filter {

    // override
    filter(target, method, prop, value = undefined) {

        if (method === 'get') {
            // do something
            return 'anything';
        }
        return super.filter(target, method, prop, value);
    }
}
// Реализация 2: последующая перегрузка
class MyFilter1 extends Filter {

    // override
    filter(target, method, prop, value = undefined) {
        try {
            return super.filter(target, method, prop, value);
        } catch (e) { // Неизвестный обработчик метода по умолчанию вызовет исключение, здесь сначала перехватите это исключение
            switch (method) { // Начните добавлять свои собственные методы обработки после
                case 'hello' :
                    // do something
                    return '...';
                    break;
            }
            throw e; // Другие неизвестные методы обработки, продолжайте вызывать исключения.
        }

    }
}

Многоуровневый атрибут чтения-записи прокси-фильтра

Да, это также основная причина введения lodash.

let obj = {
    key: {
        subkey: ['a']
    }
}

let filter1 = new Filter({
    'key.subkey.0': { // 
        get: (value, data, key, filter) => { 
            // Здесь this не текущий фильтр, а глобальный объект.
            if (filter.isEmptyString(value))
                return "hello world!";
            return value;
        }
    }
});

Filter.convertPropName Этот метод представляет собой реализацию фильтрации свойств имени, поскольку lodash _.get поддерживает многоуровневые ключи доступа key.subkey.0 или key.subkey[0], Filter.convertPropName в основном предназначен для унификации доступа к свойствам имени, в соответствии с вашими предпочтениями, перегрузите этот метод, и поведение по умолчанию заменит [ ] на ..

Основные методы построения

filter.setFilters(filters)

Установите привязку дополнительных фильтров, фильтры должны быть непустым объектом (object).

filter.isValidTarget(target)

Определите, является ли цель допустимой целью привязки, текущая эта цель должна быть объектом.

filter.verifyTarget()

Проверьте, привязан ли текущий фильтр к действительной цели, если нет, он напрямую вызовет исключение, иначе вернёт текущую привязанную цель.

filter.attach(target) и filter.unattach(target)

Привязка цели и отмена привязки.

filter.isAttached(target = undefined)

Определить, привязан ли текущий фильтр к допустимой цели, если указан параметр target, определить, является ли привязанная цель filter целевой.

Другие вспомогательные инструменты

Серия php-trim-plus, обратитесь к инструкциям по использованию.

filter.toSafeString(str);              // Преобразование в безопасную строку
filter.trim(str, charList, isPlus);    // trim
filter.ltrim(str, charList, isPlus);   // trimStart
filter.rtrim(str, charList, isPlus);   // trimEnd
filter.isString(str);                  // Является ли строка
filter.isEmptyString(str);             // Пустая ли строка

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Это объектный фильтр-агент для чтения и записи атрибутов, который является количественным и ненавязчивым. Он легко интегрируется с любой проектной средой и мгновенно повышает вашу продуктивность как программиста, а также улучшает возможность повторного использования кода. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/janpoem-prop-filter.git
git@api.gitlife.ru:oschina-mirror/janpoem-prop-filter.git
oschina-mirror
janpoem-prop-filter
janpoem-prop-filter
master