0.2.0 • Published 2 months ago

@quanxiaoxiao/datav v0.2.0

Weekly downloads
-
License
-
Repository
-
Last release
2 months ago

类似mongo,aggregate的$project,借助表达式,可以自由地选择性地保留或过滤输入数据中的某些字段,并可以按需对数据进行转换处理。

Install

npm install @quanxiaoxiao/datav

Quick Start

import { select } from '@quanxiaoxiao/datav';

select({ type: 'number' })('33.3'); // 33.3
select({ type: 'integer' })('33.3'); // 33
select({ type: 'boolean' })('true'); // true
select({ type: 'boolean' })('false'); // false

select({
  type: 'object',
  properties: {
    name: {
      type: 'string',
    },
    age: {
      type: 'integer',
    },
  },
})({ name: 'quan', age: '22.2', foo: 'bar' }); // { name: "quan", age: 22 }

select(['age', { type: 'integer' }])({ age: '33.3' }); // 33

Express

{
    "type": "object",
    "anyOf": [
        {
            "properties": {
                "type": {
                    "enum": [
                        "object"
                    ]
                },
                "properties": {
                    "type": "object"
                }
            },
            "required": [
                "type",
                "properties"
            ]
        },
        {
            "properties": {
                "type": {
                    "enum": [
                        "array"
                    ]
                },
                "properties": {
                    "anyOf": [
                        {
                            "type": "object"
                        },
                        {
                            "type": "array",
                            "items": [
                                {
                                    "type": "string"
                                },
                                {
                                    "type": "object"
                                }
                            ],
                            "additionalItems": false,
                            "minItems": 2,
                            "maxItems": 2
                        }
                    ]
                }
            },
            "required": [
                "type",
                "properties"
            ]
        },
        {
            "properties": {
                "type": {
                    "enum": [
                        "string",
                        "number",
                        "boolean",
                        "integer"
                    ]
                }
            },
            "required": [
                "type"
            ]
        }
    ]
}

当输入为数组时,数组的第一个元素表示字段路径

select(['sub.age', { type: 'integer' }])({
  name: 'quan',
  sub: { age: 33.3 },
}); // 33

With resolve

select({ type: 'integer', resolve: (v) =>  v + 1})(88); // 89

select({
  type: 'object',
  properties: {
    name: {
      type: 'string',
      resolve: (a, b) => `${a}_${b.aa}`,
    },
    age: {
      type: 'integer',
      resolve: (a) => a + 1,
    },
  },
})({
  name: 'quan',
  aa: 'xx',
  age: 33,
}); // { "name": "quan_xx", "age": 34 }
const ret = select(
  {
    type: 'object',
    properties: {
      count: {
        type: 'integer',
      },
      list: {
        type: 'array',
        properties: {
          token: ['.', {
            type: 'string',
            resolve: (d) => `${d.name}_${d.age}`,
          }],
          name: {
            type: 'string',
          },
        },
      },
    },
  },
)({
  count: 20,
  list: [
    {
      name: 'big',
      age: 11,
    },
    {
      name: 'bar',
      age: 22,
    },
  ],
});
assert.deepEqual(ret, {
  count: 20,
  list: [
    {
      name: 'big',
      token: 'big_11',
    },
    {
      name: 'bar',
      token: 'bar_22',
    },
  ],
});
0.2.0

2 months ago

0.1.2

4 months ago

0.1.1

4 months ago

0.1.0

4 months ago