实现一个 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
}