sharpshark28/json-query-chain

View on GitHub
index.js

Summary

Maintainability
A
0 mins
Test Coverage
module.exports = class Query {
  constructor (data) {
    this.data = data.map(item => {
      item.sortScore = 0
      return item
    })
  }

  get results () {
    return this.data
  }

  filter (func) {
    this.data = this.data.filter(func)
    return this
  }

  filterBy (key, func) {
    this.data = this.data.filter(item => func(item[key]))
    return this
  }

  search (key, term, score = 0) {
    switch (typeof term) {
      case 'boolean':
        this.data = this.data.filter(item => item[key] === term)
        break
      case 'string':
        this.data = this.data.filter(item => {
          let regFind = new RegExp(term, 'gi')
          let termMatches = (item[key].match(regFind) || []).length
          item.sortScore += termMatches
          return termMatches
        })
        break
    }
    return this
  }

  sort (key = 'sortScore') {
    this.data = this.data.sort((a, b) => {
      if (a[key] < b[key]) return -1
      if (a[key] > b[key]) return 1
      return 0
    })
    return this
  }

  paginate (page = 1, perPage = 10) {
    let min = page * perPage - perPage
    let max = min + perPage
    this.data = this.data.slice(min, max)
    return this
  }
}