基于任意排序的 Javascript 数组排序

时间:2021-04-01 17:24:22

标签: javascript arrays sorting

假设我有一个需要基于三种语言任意排序的书籍列表。这本书的语言由一个字符串表示。在包含多种语言的书籍中,它是一个逗号分隔的语言字符串,其中英语总是在西班牙语和法语之前,西班牙语总是在法语之前。

[
{ language: 'English' },
{ language: 'French' },
{ language: 'English, French' },
{ language: 'Spanish, French' },
{ language: 'English, Spanish, French' }
{ language: 'Spanish' }
]

如果我想对这个数组进行排序,以便总是先用英语的书籍,然后是西班牙语的书籍,然后是法语的书籍,除了制作包含这样的正确顺序的数组之外,还有其他方法可以做到这一点

>
const orderArray = ['English', 'English, Spanish', 'English, Spanish, French', 'English, French', 'Spanish, French', 'Spanish', 'French']

然后用这样的东西循环它?

const orderBooks = (books) => {
    const orderedBooks = [];
        orderArray.forEach((language) => {
            const bookIndex = books.findIndex(book => book.language === language);
            if (bookIndex >= 0) {
                orderedBooks.push(books[bookIndex]);
            }
        
    });
    return orderedBooks;
};

有没有办法根据这样的简单偏好数组对它们进行排序?

['English', 'Spanish', 'French']

1 个答案:

答案 0 :(得分:0)

您可以根据一本书中的第一种语言而不是另一本书中的第一种语言进行排序。

  books.sort((a, b) => {
     const difference = orderArray.find(language =>  
       a.includes(language) !== b.includes(language)
     );
     return a.includes(difference) - b.includes(difference);
 });

更复杂(/优雅)的实现是:

 const sortBy = (comp, ...others) => (a, b) =>
   a.includes(comp) - b.includes(comp) || sortBy(...others)(a, b);

 books.sort(sortBy(...preferenceArray));
相关问题