gggso / array-pipeline

JS数组管道,筛选、合并、排序、分组等(该项目已转移到ttools,不再更新)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Install

  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 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],
   },
   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(data)

使用链式风格

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)

About

JS数组管道,筛选、合并、排序、分组等(该项目已转移到ttools,不再更新)


Languages

Language:JavaScript 100.0%