methods/alphabetical-sort.js

/**
 * @method
 * @memberof ecomUtils
 * @name alphabeticalSort
 * @description Sort list of objects alphabetically by name ot title property.
 * @param {array|object} list - Array of objects (products, brands...) or list body with 'results'
 * @returns {array}
 *
 * @example
 * // Sample array with name or title's property
 * ecomUtils.alphabeticalSort(['product', 'category'])
 * // => ["category", "product"]
 * ecomUtils.alphabeticalSort(['Matheus', 'Vitor', 'Ana', 'Clara', 'Bruna'])
 * // => ["Ana", "Bruna", "Clara", "Matheus", "Vitor"]
 * // Can be an array of objects like:
 * const brand1 = {name: 'zara'}
 * const brand2 = {name: 'Thermaltake'}
 * const brand3 = {name: 'AeroCool'}
 * const brand4 = {name: 'Fortrek'}
 * const array = [brand1, brand2, brand3, brand4]
 * ecomUtils.alphabeticalSort(array)
 * // => [{name: "AeroCool"}, {name: "Fortrek"}, {name: "Thermaltake"}, {name: "Thermaltake"}, {name: "zara"}]
 */
const alphabeticalSort = list => {
  if (Array.isArray(list)) {
    // try to sort by name or title
    return list.sort((a, b) => {
      if (a && b) {
        if (a.name) {
          // products, categories, brand...
          return a.name < b.name ? -1 : 1
        } else if (a.title) {
          // grids
          return a.title < b.title ? -1 : 1
        }
      }
      // fallback
      return a < b ? -1 : 1
    })
  }

  if (typeof list === 'object' && list !== null) {
    // suppose to be a 'list all' request body
    return alphabeticalSort(list.results)
  }
  console.error(new Error('`list` should be an array'))
  // always return an array
  return []
}

export default alphabeticalSort