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
        }

你可能感兴趣的:(javascript,前端,数据库)