Open nmsn opened 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);