{"id":26473012,"url":"https://github.com/unicreators/object-expression-parser","last_synced_at":"2025-03-19T21:50:39.009Z","repository":{"id":57312551,"uuid":"88479918","full_name":"unicreators/object-expression-parser","owner":"unicreators","description":"javascript object expression parser.","archived":false,"fork":false,"pushed_at":"2017-04-25T08:42:44.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-04T09:46:59.636Z","etag":null,"topics":["expression-parser","javascript"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unicreators.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-04-17T06:44:40.000Z","updated_at":"2017-04-17T06:51:06.000Z","dependencies_parsed_at":"2022-09-06T19:41:13.030Z","dependency_job_id":null,"html_url":"https://github.com/unicreators/object-expression-parser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unicreators%2Fobject-expression-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unicreators%2Fobject-expression-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unicreators%2Fobject-expression-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unicreators%2Fobject-expression-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unicreators","download_url":"https://codeload.github.com/unicreators/object-expression-parser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244513916,"owners_count":20464601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["expression-parser","javascript"],"created_at":"2025-03-19T21:50:38.482Z","updated_at":"2025-03-19T21:50:39.001Z","avatar_url":"https://github.com/unicreators.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## ObjectExpressionParser\n\n一个支持自定义操作符的 javascript 对象表达式转换器，可根据自定义的操作符生成不同语法。\n  \n```js\nlet e = {\n    'name': 'yichen',\n    age: { '$gt': 18, '$lt': 30 },\n    '||': { 'level': [1, 2], 'age': { '$in': [3, 4] } }\n};\n\nlet { segment, values } = expressionParser.parse(e);\n\n\nconsole.log(segment);\n// (name = ?) and ((age \u003e ?) and (age \u003c ?)) and ((level in (?)) or (age in (?)))\n\nconsole.log(values);\n// [ 'yichen', 18, 30, [ 1, 2 ], [ 3, 4 ] ]\n\n```    \n    \n    \n## Install\n\n```sh\n$ npm install object-expression-parser\n```\n  \n  \n## Usage\n\n### 配置比较操作符\n\n- 配置支持 \u003e、\u003c、=、in 的比较操作符。\n\n```js\nlet c = {\n    '$gt': {          \n        through: false,\n        // more attribute..        \n        parse: function (prop, value, originalOperator, level, context) {\n            return { segment: `${prop} \u003e ?`, values: [value] };\n        }\n    },\n    '$lt': function (prop, value, originalOperator, level, context) {\n        return { segment: `${prop} \u003c ?`, values: [value] };\n    },\n    '$eq': function (prop, value, originalOperator, level, context) {\n        return { segment: `${prop} = ?`, values: [value] };\n    },\n    '$in': function (prop, value, originalOperator, level, context) {\n        return { segment: `${prop} in (?)`, values: [value] };\n    }\n};\n```\n  \n  \n### 配置逻辑操作符\n\n- 配置支持 and、or 的逻辑操作符。\n\n\n```js\nlet l = {\n    '\u0026\u0026': function (expr, segments, originalOperator, level, context) {\n        if (segments.length == 1) return segments[0];\n        return `(${segments.join(`) and (`)})`;\n    },   \n    '||': function (expr, segments, originalOperator, level, context) {\n        if (segments.length == 1) return segments[0];\n        return `(${segments.join(`) or (`)})`;\n    }\n};\n```\n  \n  \n### 配置一元操作符\n\n- 配置支持 not 的一元操作符。\n\n\n```js\nlet u = {\n    '$not': function (expr, segment, originalOperator, level, context) {            \n        return `not(${segment})`;\n    }\n    \n};\n```\n  \n  \n### 其它配置\n\n\n```js\n// 当未指明比较操作符时视为使用 $eq 处理\nlet defaultOperator = '$eq';\n\n// 当未指明逻辑操作符时视为使用 \u0026\u0026 处理\nlet defaultLogicalOperator = '\u0026\u0026';\n\n// 当未指明比较操作符且值为数组时使用 $in 处理\nlet arrayValueOperator = '$in';\n\n// 设置操作符忽略大小写\nlet operatorIgnorecase = true;\n```\n  \n  \n### 构建 ObjectExpressionParser 实例\n\n- 使用配置参数构建 ObjectExpressionParser 实例    \n\n\n```js\nlet expressionParser = new ObjectExpressionParser(c, l, \n                    defaultOperator, defaultLogicalOperator, \n                    arrayValueOperator, operatorIgnorecase, u);\n```\n  \n  \n### 转换表达式\n\n\n```js\nlet e = {\n    'name': 'yichen',\n    age: { '$gt': 18, '$lt': 30 },\n    '||': { 'level': [1, 2], 'age': { '$in': [3, 4] } }\n};\n\nlet { segment, values } = expressionParser.parse(e);\n\n\nconsole.log(segment);\n// (name = ?) and ((age \u003e ?) and (age \u003c ?)) and ((level in (?)) or (age in (?)))\n\nconsole.log(values);\n// [ 'yichen', 18, 30, [ 1, 2 ], [ 3, 4 ] ]\n\n```\n  \n  \n## Operator attributes  \n\n\n| attribute     | type                      | required  | default   | desc    |\n|:---           | :---                      | :---      | :---      | :---    |\n| `parse`       | `Function`                | `yes`     |           | 表达式核心转换方法，用于将对象(表达式)转换成字符串\n| `through`     | `Boolean`                 |           | `False`   | 设置操作符不解析子对象(表达式)，而是将子对象(表达式)直接传递给`parse`方法\n| `priority`    | `Int`                     |           |           | 操作符优先级(同级多个操作符解析时，此数值小的优先解析)\n| `single`      | `Boolean`                 |           | `False`   | 限定操作符仅可在被解析对象(表达式)中出现一次\n| `level`       | `Int, [Int]`                     |           |           | 限定操作符在对象(表达式)中的层级 \n| `children`    | `Object`                  |\n| - `parseBehavior`      | `ParseBehavior`  |           | `Default`   | 设置子级对象(表达式)转换行为\n|               | *`ParseBehavior.OperatorOnly`*  |           |   | 只转换操作符对象(表达式)\n|               | *`ParseBehavior.PropertyOnly`*  |           |   | 只转换常规属性对象(表达式)\n|               | *`ParseBehavior.OperatorFirst`*  |           |   | 优先转换操作符对象(表达式)\n|               | *`ParseBehavior.PropertyFirst`*  |           |   | 优先转换常规属性对象(表达式)\n|               | *`ParseBehavior.Default`*  |           |   | 按定义顺序转换(未设置此项时使用该行为)\n| - `required`  | `String, [String]`         |           |           | 限定子级对象(表达式)中必须包括此列表中指定的操作符\n| - `optional`  | `String, Object, [String], [Object]`  |           |           | 限定子级对象(表达式)中除`required`列表中指定的操作符之外，只可使用此列表中指定的操作符\n|   -- `name`     | `String`                  | `yes`     |           | 操作符名称\n|   -- `autoParse`| `Boolean`                 |           | `False`   | 指定当对象(表达式)中未包含`name`中指定的操作符时，是否自动执行此操作符的转换操作\n|   -- `defaultTo`| `Any`                     |           |           | 指定当`autoParse`为`true`时，执行转换操作传递给`parse`的对象(表达式)或值\n| `siblings`    | `String, [String]`         |           |           | 限定同级对象(表达式)中必须包括此列表中指定的操作符\n| `parents`     | `String, [String]`         |           |           | 限定父级操作符必须为`parents`列表中的一个\n| `runtimeValidate` | `Function`            |           |           | 自定义运行时对象(表达式)或值的验证方法\n\n  \n  \n## Attribute 'parse' method\n- 表达式核心转换方法\n  \n### ComparisonOperator\n  \n\n```js\nfunction(prop, value, originalOperator, level, context) { \n  // segment, values \n  return { segment: '', values: [] };\n}\n```\n\n\n| argument              | type      | desc  |\n|:---                   | :---      | :---  |\n| `prop`                | `String`  | 要转换的属性名称\n| `value`               | `Any`     | 要转换的属性值\n| `originalOperator`    | `String`  | 原始操作符\n| `level`               | `Int`     | 要转换的属性在对象(表达式)中所处的层级\n| `context`             | `Any`     | 惯穿全局的上下文对象(由`ObjectExpressionParser.parse`方法传入)\n\n  \n  \n### LogicalOperator\n\n\n```js\nfunction(expr, segments, originalOperator, level, context) { \n  // segment, values \n  return { segment: '', values: [] };\n}\n```\n\n\n| argument              | type      | desc  |\n|:---                   | :---      | :---  |\n| `expr`                | `Any`     | 原始的对象(表达式)\n| `segments`            | `[String]`| 转换后的子级对象(表达式)片段, 当操作符属性(attribute)`through`为`True`时，此参数值为`undefined`\n| `originalOperator`    | `String`  | 原始操作符\n| `level`               | `Int`     | 要转换的属性在对象(表达式)中所处的层级\n| `context`             | `Any`     | 惯穿全局的上下文对象(由 `ObjectExpressionParser.parse`方法传入)\n\n  \n    \n### UnaryOperator\n\n\n```js\nfunction(expr, segment, originalOperator, level, context) { \n  // segment, values \n  return { segment: '', values: [] };\n}\n```\n  \n\n| argument              | type      | desc  |\n|:---                   | :---      | :---  | \n| `expr`                | `Any`     | 原始的对象(表达式)\n| `segment`             | `String`  | 转换后的子级对象(表达式)片段, 当操作符属性(attribute)`through`为`True`时，此参数值为`undefined`\n| `originalOperator`    | `String`  | 原始操作符\n| `level`               | `Int`     | 要转换的属性在对象(表达式)中所处的层级\n| `context`             | `Any`     | 惯穿全局的上下文对象(由 `ObjectExpressionParser.parse`方法传入)\n\n  \n  \n## ObjectExpressionParser 构造\n\n```js\n/**\n* \n* @param {Object} comparisonOperators \n* 配置比较操作符及对应处理方法\n* @param {Object} logicalOperators \n* 配置逻辑操作符及对应处理方法\n* @param {String} defaultOperator \n* 指定当未指明比较操作符时所使用的操作符, 此操作符必须存在于配置(comparisonOperators)中。\n* 对应表达式如 { prop: 10 } \n* @param {String} defaultLogicalOperator \n* 指定当未指明逻辑操作符时所使用的操作符, 此操作符必须存在于配置(logicalOperators)中。\n* 对应表达式如 { prop: { '\u003e': 1, '\u003c': 10 } } \n* @param {String} arrayValueOperator \n* 指定当值为数组时所使用的操作符, 此操作符必须存在于配置(comparisonOperators)中。\n* 对应表达式如 { prop: [1, 2, 4, 8] } \n* @param {Boolean} operatorIgnorecase\n* 操作符是否忽略大小写, 默认true\n* @param {Object} unaryOperators\n* 配置一元操作符及对应处理方法\n*/\nconstructor (comparisonOperators, logicalOperators, defaultOperator,\n        defaultLogicalOperator, arrayValueOperator, operatorIgnorecase = true, unaryOperators = undefined) {\n\n}\n\n```\n  \n  \n### ObjectExpressionParser.parse 方法\n\n```js\n/**\n* \n* @param {Object} expr\n* 要转换的对象\n*\n* @param {Object} context \n* 上下文对象, 此对象将被传递至操作符处理方法中\n*\n* @returns {Object}\n* { segment: '...', values: [] }\n*/\nparse(expr, context = undefined) {\n    //...\n}\n\n```\n\n\n```js\nlet { segment, values } = expressionParser.parse({ 'name': 'a' });\n```\n  \n  \n\n## License\n\n[MIT](LICENSE)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funicreators%2Fobject-expression-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funicreators%2Fobject-expression-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funicreators%2Fobject-expression-parser/lists"}