In Memory Search Engine

function InMemorySearch() {
  this.entities = new Map();

  this.addDocuments = (namespace, ...documents) => {
    const existing = this.entities.get(namespace);
    if (existing) {
      this.entities.set(namespace, [...existing, ...documents]);
    } else {
      this.entities.set(namespace, [...documents]);
    }
  };

  this.search = (namespace, filterFn, orderBy) => {
    const documents = this.entities.get(namespace);
    const filtered = documents.filter(filterFn);
    if (orderBy) {
      const { key, asc } = orderBy;
      filtered.sort((a, b) => {
        if (asc) {
          return a[key] - b[key];
        } else {
          return b[key] - a[key];
        }
      });
    }
    return filtered;
  };
}
const searchEngine = new InMemorySearch();
searchEngine.addDocuments(
  "Movies",
  { name: "Avengers", rating: 8.5, year: 2017 },
  { name: "Black Adam", rating: 8.7, year: 2022 },
  { name: "Jhon Wick 4", rating: 8.2, year: 2023 },
  { name: "Black Panther", rating: 9.0, year: 2022 }
);
console.log(
  searchEngine.search("Movies", (e) => e.rating >= 8.5, {
    key: "rating",
    asc: false,
  })
);

// [
//   { name: 'Black Panther', rating: 9, year: 2022 },
//   { name: 'Black Adam', rating: 8.7, year: 2022 },
//   { name: 'Avengers', rating: 8.5, year: 2017 }
// ]