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
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;
}
}
});
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 )