Ali Arr Query

看了鲨鱼辣椒的面经,阿里考了这题

题目
// 提供了一个数组结构的 data,要求实现一个 query 方法,返回一个新的数组,
// query 方法内部有 过滤、排序、分组 等操作,并且支持链式调用,调用最终的 execute 方法返回结果:

const result = query(list)
  .where(item => item.age > 18)
  .sortBy('id')
  .groupBy('name')
  .execute();

console.log(result);
我的答案
function query(arr) {
  let currentArr = arr

  return {
    where(callback) {
      currentArr = currentArr.filter(callback)
      return this
    },
    sortBy(key) {
      currentArr.sort((a, b) => a[key] - b[key])
      return this
    },
    groupBy(key) {
      const map = new Map()
      currentArr.forEach(item => {
        map.set(item[key], map.has(item[key]) ? [...map.get(item[key]), item] : [item])
      })
      currentArr = Array.from(map.values())
      return this
    },
    execute() {
      return currentArr
    },
  }
}
结果
const list = [
  {
    id: 1,
    name: 'a',
    age: 20,
  },
  {
    id: 3,
    name: 'a',
    age: 33,
  },
  {
    id: 10,
    name: 'b',
    age: 30,
  },
  {
    id: 2,
    name: 'b',
    age: 1,
  },
]

const result = query(list)
  .where(item => item.age > 18)
  .sortBy('id')
  .groupBy('name')
  .execute();

console.log(result);

/**
 * [
    [ { id: 1, name: 'a', age: 20 }, { id: 3, name: 'a', age: 33 } ],
    [ { id: 10, name: 'b', age: 30 } ]
  ]
 */
Updated on 6/25/2023