面试题——实现一个链式调用的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);
    

  • 需要注意的是,这只是一个简单的实现方式,还有很多细节需要考虑,例如对于分组操作,如果 key 的值为 null 或
    undefined,需要如何处理。

  • 对于为什么要在Class内部的方法返回this,因为要实现方法链式调用,得在调用方法后得到this指向的对象,实现继续调用内部方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值