Сортировать объект по нескольким параметрам (первая буква и логическое значение) - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь отсортировать объект ниже по порядку имен, начинающихся с первой буквы sortKey, за которыми следуют имена, начинающиеся со второй буквы sortKey ... и так далее.Любое имя, которое не начинается с буквы в sortKey, может быть добавлено в список после.

Но также, если любой предметов имеет продажную стоимость true, они появятсяв конце списка.

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}
]};

Надеюсь, я объяснил это достаточно хорошо, и заранее благодарю за любую помощь:)

1 Ответ

0 голосов
/ 06 октября 2018

Может быть немного удобнее кодировать, если в качестве порядка сортировки используется поиск объекта, а не массив, например:

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

Это будет препятствовать поиску индекса каждый раз.Но это все еще работоспособно.Основным идентификатором является сортировка на продажу / не продажу, затем сортировка по индексу в sortKey, добавление большого ключа сортировки для не найденных (потому что indexOf возвращает -1 для не найденного), а затем просто обычная алфавитная сортировка:

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})))

Это должно поставить все элементы sale: true в конце, все имена не продаются впереди и упорядочены по sortKey, если они находятся в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...