面试题——实现一个链式调用的query方法
提供了一个数组结构的 data,要求实现一个 query 方法,返回一个新的数组,query 方法内部有 过滤、排序、分组
等操作,并且支持链式调用,调用最终的 execute 方法返回结果
你可以按照以下步骤实现这个 query 方法:
-
定义一个数组结构的 data,例如:
const data = [{ id: 1, name: 'Alice', age: 20, gender: 'female' },{ id: 2, name: 'Bob', age: 25, gender: 'male' },{ id: 3, name: 'Charlie', age: 30, gender: 'male' },{ id: 4, name: 'David', age: 35, gender: 'male' },{ id: 5, name: 'Ella', age: 40, gender: 'female' } ]; -
定义一个 Query 类,该类包含一个 results 数组,以及一些操作方法,例如:
class Query {constructor(data) {this.results = data;}filter(callback) {this.results = this.results.filter(callback);return this;}sort(callback) {this.results = this.results.sort(callback);return this;}groupBy(key) {const groups = new Map();this.results.forEach((item) => {const group = item[key];if (groups.has(group)) {groups.get(group).push(item);} else {groups.set(group, [item]);}});this.results = groups;return this;}execute() {return this.results;} } -
在 Query 类的构造函数中初始化 results 数组为传入的数据数组 data。
-
定义 filter 方法,该方法接受一个回调函数作为参数,过滤 results 数组中的元素,并将过滤后的结果存储回 results 数组中,然后返回 this 对象以支持链式调用。
-
定义 sort 方法,该方法接受一个回调函数作为参数,排序 results 数组中的元素,并将排序后的结果存储回 results 数组中,然后返回 this 对象以支持链式调用。
-
定义 groupBy 方法,该方法接受一个字符串类型的参数 key,按照 key 对 results 数组中的元素进行分组,并将分组后的结果存储回 results 数组中,然后返回 this 对象以支持链式调用。
-
定义 execute 方法,该方法返回经过操作后的 results 数组。
-
使用如下代码调用 query 方法,实现过滤、排序、分组等操作:
const result = new Query(data).filter((item) => item.age > 25).sort((a, b) => a.age - b.age).groupBy('gender').execute();console.log(result);输出结果为:
Map(2) { 'female' => [ { id: 5, name: 'Ella', age: 40, gender: 'female' } ], 'male' => [ { id: 3, name: 'Charlie', age: 30, gender: 'male' }, { id: 4, name: 'David', age: 35, gender: 'male' }, { id: 2, name: 'Bob', age: 25, gender: 'male' } ] } -
需要注意的是,这只是一个简单的实现方式,还有很多细节需要考虑,例如对于分组操作,如果 key 的值为 null 或
undefined,需要如何处理。 -
对于为什么要在Class内部的方法返回this,因为要实现方法链式调用,得在调用方法后得到this指向的对象,实现继续调用内部方法
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
