Может быть немного удобнее кодировать, если в качестве порядка сортировки используется поиск объекта, а не массив, например:
{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
, если они находятся в массиве.