js实现链式调用,查询和处理数据

实现一个 query 方法,实现对数据的链式查询和处理
要求如下
query 传入参数为原始数据(数组格式,每个元素都是对象)
通过进行链式调用对数据执行操作,支持的方法有where(predicate): 根据参数的条件进行筛选,参数与 [].filter 的参数类似
orderBy(key, desc): 根据 key 的值进行排列,默认升序排列,当第二个参数为 true 时降序排列
groupBy(key): 根据 key 的值对数据元素进行分组,合并为二维数组
execute(): 执行所有处理并返回最终结果
执行 execute 方法时才真正执行操作并返回结果

        const data = [
            { name: 'foo', age: 16, city: 'shanghai' },
            { name: 'bar', age: 24, city: 'hangzhou' },
            { name: 'fiz', age: 22, city: 'shanghai' },
            { name: 'baz', age: 19, city: 'hangzhou' }
        ];
        query(data)
            .where(item => item.age > 18)
            .orderBy('age')
            .groupBy('city')
            .execute();

        // 结果返回
        [
            [
                { name: 'baz', age: 19, city: 'hangzhou' },
                { name: 'bar', age: 24, city: 'hangzhou' },
            ],
            [
                { name: 'fiz', age: 22, city: 'shanghai' },
            ]
        ]
        function query(data) {
            const _data = data
            let dealing_data = null
            const funs = {
                where,
                orderBy,
                groupBy,
                execute
            }
            function where(cb) {
                dealing_data = _data.filter(element => cb(element));
                return funs

            }
            function orderBy(key, desc) {
                const deal_data = dealing_data ?? _data
                deal_data.sort((a, b) => !desc ? a[key] - b[key] : b[key] - a[key])
                return funs
            }
            function groupBy(key) {
                const deal_data = dealing_data ?? _data
                const map = {}
                deal_data.forEach(element => {
                    if (map[element[key]]) {
                        map[element[key]].push(element)
                    } else {
                        map[element[key]] = [element]
                    }
                });
                dealing_data = Object.values(map).reduce((pre, cur) => {
                    pre.push(cur)
                    return pre
                }, [])
                return funs
            }
            function execute() {
                const deal_data = dealing_data ?? _data
                console.log('最终结果', deal_data)
                return deal_data
            }
            return funs
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鲤余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值