mortal-cultivation-biography / daydayup

A FE interview-questions collection repo.
8 stars 0 forks source link

实现一个 query 方法,实现对数据的链式查询和处理 #79

Open nmsn opened 1 year ago

nmsn commented 1 year ago
function query(data) {
  let list = data;
  const opera = [];
  const object = {
    where(func) {
      opera.push(["_where", [func]]);
      return object;
    },
    _where(func) {
      list = list.filter(func);
    },
    orderBy(key, desc) {
      opera.push(["_orderBy", [key, desc]]);
      return object;
    },
    _orderBy(key, desc) {
      list = list.sort((a, b) => (desc ? b[key] - a[key] : a[key] - b[key]));
    },
    groupBy(key) {
      opera.push(["_groupBy", [key]]);

      return object;
    },
    _groupBy(key) {
      let result = [];
      list.forEach((item) => {
        if (result.find((item2) => item2[0][key] === item[key])) {
          const arr = result.find((item2) => item2[0][key] === item[key]);
          arr.push(item);
        } else {
          result.push([item]);
        }
      });

      list = result;
    },
    execute() {
      opera.forEach(([exec, params]) => {
        object[exec](...params);
      });

      return list;
    },
  };

  return object;
}

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" },
];

const result = query(data)
  .where((item) => item.age > 18)
  .orderBy("age")
  .groupBy("city")
  .execute();

console.log(result);