1.0.2 • Published 6 years ago

array-pipeline v1.0.2

Weekly downloads
3
License
ISC
Repository
github
Last release
6 years ago

Installation

  npm install array-pipeline --save

使用

使用方法同时支持函数和对象声明两种风格。

path中的“*”号通配符表示匹配当前路径下数组中的所有key,即匹配数组中的每个子项,同时也可以通过指定具体的key来精确匹配某个单项。

let pipeline = require('array-pipeline')

// 使用对象表达式风格
let result = pipeline(data, options)

// 使用函数风格
let { data } = pipeline(data).filter(options)

选项或方法

数据以管道流的方式依次传递,一个方法执行完后,会将处理结果转给下一个方法。

filter

and方法的别名

and

提取同时满足所有条件的数据

or

提取仅满足一个或多个条件的数据

in

in相当于在and基础上提供了多值验证。以数组的方式定义多个匹配值,只要命中其中之一,即表示匹配。

group

按照指定的键路径对数据进行分组,路径中不能包含*号。

需要注意的是分组后的数组将被转为对象结构,因此会脱离管道流,但对于分组而言对象结构更有利于后续处理。

join

用于按条件合并两个数组,类似sql数据库的join操作,将两个数组通过公共键合并为一个数组。

set

搜索符合条件的path,执行批量替换操作,如果值不存在时会创建新的key/value

sort

数组排序,支持多列排序和嵌套数组排序。多层嵌套数组排序不会改变父级顺序,只是对多个嵌套数组本身的排序

limit

限制返回处理结果数量

示例

测试数据

  let data = [
     { id: 11, b: "name" },
     { id: 88, b: "name" },
     { id: 23, b: "age" },
     { id: 342454, b: "age" },
     { id: 88, b: "test" },
     {
        id: 553,
        b: {
           xx: {
              jj: {
                 ss: { vv: 888 }
              }
           },
           xxx: {
              jj: {
                 ss: {
                    vv: 666,
                    vvv: 888,
                 }
              }
           }
        }
     },
     {
        id: 553,
        b: [{
           kk: [{
              ss: [{
                 ss: 666,
              }],
           }],
           jj: 888,
        }],
     },
     {
        id: 553,
        b: [{
           kk: [{
              ss: {
                 dd: [{
                    ss: 666,
                 }]
              },
           }],
        }],
     },
  ]

使用对象表达式风格

  let test = pipeline(data, {
     filter: {
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     },
     and: {
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     },
     or: {
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     },
     in: {
        'id': [553, 8881],
        'b.*.kk.*.ss.dd.*.ss': [666, 2323],
     },
     join: {
        'data': [],
        'path': {
           'b.*.kk.*.ss.dd.*.ss': 'k.*.kk.*.ss.dd.*.ss',
        },
     },
     set: {
        'jid': 8888,
        'hxs': 484848,
     },
     sort: {
        'id': 'DESC',
        'cid': 'DESC',
        'b.*.xx': 'ASE',
        'b.*.kk.*.ss.dd.*.xx': 'ASE',
        'oo.o1': 'DESC'
     },
     limit: 12,
  })

  console.log(test)

使用链式风格

  let { data } = pipeline(data)
     .filter({
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     })
     .and({
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     })
     .or({
        'id': 553,
        'b.*.kk.*.ss.dd.*.ss': 666,
     })
     .in({
        'id': [553, 8881],
        'b.*.kk.*.ss.dd.*.ss': [666, 2323],
     })
     .set({
        'jid': 8888,
        'hxs': 484848,
     })

  console.log(data)