-1

I'm trying to sort the object below in order of names beginning with the first letter of the sortKey, followed by names beginning with second letter of the sortKey... and so on. Any name that doesn't begin with a letter in the sortKey can be added to the list after.

But also if any of the items have a sale value of true they'll appear at the end of the list.

const content = {
  Designer: "designer name",
  sortKey: ['H', 'R', 'N'],
  items: [
    {name: "Haleema", sale: false, images: Array(3), date: 1538692915225},
    {name: "Haidee", sale: false, images: Array(3), date: 1538692881303},
    {name: "Nadette", sale: false, images: Array(3), date: 1534642464516},
    {name: "Nana", sale: false, images: Array(3), date: 1534642463516},
    {name: "Nara", sale: false, images: Array(3), date: 1534642462516},
    {name: "Nativdad", sale: false, images: Array(3), date: 1534642461516},
    {name: "Noreen", sale: false, images: Array(3), date: 1534642460516},
    {name: "Nova", sale: false, images: Array(3), date: 1534642459516},
    {name: "Ada", sale: false, images: Array(3), date: 1534642458516},
    {name: "Adele", sale: false, images: Array(3), date: 1534642457516},
    {name: "Ainsley", sale: false, images: Array(3), date: 1534642456516},
    {name: "Alicia", sale: true, colour: "", size: "UK14", price: "was £1650"},
    {name: "Alison", sale: false, images: Array(3), date: 1534642454516},
    {name: "Angelica", sale: false, images: Array(3), date: 1534642453516},
    {name: "Antonia", sale: true, colour: "", size: "UK14", price: "was £2250"},
    {name: "Aryana", sale: false, images: Array(3), date: 1534642451516},
    {name: "Norma", sale: false, images: Array(2), date: 1534642450516},
    {name: "Robyn", sale: false, images: Array(3), date: 1534642449516},
    {name: "Honey", sale: false, images: Array(3), date: 1534642448516},
    {name: "Erica", sale: true, colour: "", size: "UK14", price: "was £1895"},
    {name: "Audrey", sale: false, images: Array(3), date: 1534642446516},
    {name: "Elke", sale: false, images: Array(1), date: 1534642445516},
    {name: "Eliza", sale: true, colour: "", size: "UK10", price: "was £1425"},
    {name: "Nikita", sale: false, images: Array(3), date: 1534642443516},
    {name: "Emmanuelle", sale: false, images: Array(3), date: 1534642442516},
    {name: "Helaine", sale: false, images: Array(3), date: 1534642441516},
    {name: "Nina", sale: false, images: Array(3), date: 1534642440516},
    {name: "Elma", sale: false, images: Array(3), date: 1534642439516},
    {name: "Nora", sale: false, images: Array(3), date: 1534642438516},
    {name: "Nicolette", sale: false, images: Array(3), date: 1534642437516},
    {name: "Erin", sale: false, images: Array(3), date: 1534642436516},
    {name: "Hazel", sale: false, images: Array(3), date: 1534642435516},
    {name: "Heva", sale: false, images: Array(3), date: 1534642434516},
    {name: "Ryoko", sale: true, colour: "", size: "UK12", price: "was £1495"},
    {name: "Nouvelle", sale: false, images: Array(3), date: 1534642432516},
    {name: "Noleen", sale: false, images: Array(2), date: 1534642431516},
    {name: "Hilaria", sale: false, images: Array(3), date: 1534642430516},
    {name: "Hermione", sale: false, images: Array(3), date: 1534642429516}
]};

I hope I've explained that well enough, and thank you in advance for any assistance :)

ironmike
  • 143
  • 2
  • 13
  • 1
    Possible duplicate of [Sort array of objects by string property value in JavaScript](https://stackoverflow.com/questions/1129216/sort-array-of-objects-by-string-property-value-in-javascript) – jhpratt Oct 06 '18 at 00:08
  • 1
    Possible duplicate of [Sort an array of object by a property (with custom order, not alphabetically)](https://stackoverflow.com/questions/47158756/sort-an-array-of-object-by-a-property-with-custom-order-not-alphabetically) or [Sort an array in custom alphabetical order](https://stackoverflow.com/q/33674028/215552) – Heretic Monkey Oct 06 '18 at 00:54

1 Answers1

0

It might be a little more convenient to code if your sort order was an object lookup rather than an array like:

{H: 0, R: 1, N: 2}

This would prevent looking up the index each time. But it's still workable. The basic ides is to sort into sale/non-sale, then sort by index in the sortKey adding a large sort key for those not found (because indexOf returns -1 for not found), then just a regular alphabetic sort:

const content = {
    Designer: "designer name",
    sortKey: ['H', 'R', 'N'],
    items: [{name: "Haleema", sale: false, images: Array(3), date: 1538692915225},{name: "Haidee", sale: false, images: Array(3), date: 1538692881303},{name: "Nadette", sale: false, images: Array(3), date: 1534642464516},{name: "Nana", sale: false, images: Array(3), date: 1534642463516},{name: "Nara", sale: false, images: Array(3), date: 1534642462516},{name: "Nativdad", sale: false, images: Array(3), date: 1534642461516},{name: "Noreen", sale: false, images: Array(3), date: 1534642460516},{name: "Nova", sale: false, images: Array(3), date: 1534642459516},{name: "Ada", sale: false, images: Array(3), date: 1534642458516},{name: "Adele", sale: false, images: Array(3), date: 1534642457516},{name: "Ainsley", sale: false, images: Array(3), date: 1534642456516},{name: "Alicia", sale: true, colour: "", size: "UK14", price: "was £1650"},{name: "Alison", sale: false, images: Array(3), date: 1534642454516},{name: "Angelica", sale: false, images: Array(3), date: 1534642453516},{name: "Antonia", sale: true, colour: "", size: "UK14", price: "was £2250"},{name: "Aryana", sale: false, images: Array(3), date: 1534642451516},{name: "Norma", sale: false, images: Array(2), date: 1534642450516},{name: "Robyn", sale: false, images: Array(3), date: 1534642449516},{name: "Honey", sale: false, images: Array(3), date: 1534642448516},{name: "Erica", sale: true, colour: "", size: "UK14", price: "was £1895"},{name: "Audrey", sale: false, images: Array(3), date: 1534642446516},{name: "Elke", sale: false, images: Array(1), date: 1534642445516},{name: "Eliza", sale: true, colour: "", size: "UK10", price: "was £1425"},{name: "Nikita", sale: false, images: Array(3), date: 1534642443516},{name: "Emmanuelle", sale: false, images: Array(3), date: 1534642442516},{name: "Helaine", sale: false, images: Array(3), date: 1534642441516},{name: "Nina", sale: false, images: Array(3), date: 1534642440516},{name: "Elma", sale: false, images: Array(3), date: 1534642439516},{name: "Nora", sale: false, images: Array(3), date: 1534642438516},{name: "Nicolette", sale: false, images: Array(3), date: 1534642437516},{name: "Erin", sale: false, images: Array(3), date: 1534642436516},{name: "Hazel", sale: false, images: Array(3), date: 1534642435516},{name: "Heva", sale: false, images: Array(3), date: 1534642434516},{name: "Ryoko", sale: true, colour: "", size: "UK12", price: "was £1495"},{name: "Nouvelle", sale: false, images: Array(3), date: 1534642432516},{name: "Noleen", sale: false, images: Array(2), date: 1534642431516},{name: "Hilaria", sale: false, images: Array(3), date: 1534642430516},{name: "Hermione", sale: false, images: Array(3), date: 1534642429516}]};
  
  content.items.sort((a,b) => {
      let aIndex = content.sortKey.indexOf(a.name[0]) 
      let bIndex = content.sortKey.indexOf(b.name[0]) 
      if (aIndex === -1) aIndex = content.sortKey.length // set sortkey to allow sorting for letters not in the sort key
      if (bIndex === -1) bIndex = content.sortKey.length
    
      return (a.sale - b.sale) || (aIndex - bIndex) || a.name.localeCompare(b.name)
  })

  console.log(content.items.map(i => ({name: i.name, sale: i.sale})))

This should put all the sale: true items at the end, all the name not on sale at the front and ordered by sortKey if it's in the array.

Mark
  • 90,562
  • 7
  • 108
  • 148
  • This works just how I wanted, thank you! Very informative too with I really appreciate. Thanks again! :) – ironmike Oct 06 '18 at 00:58