Как сортировать массив объектов по значениям пары ключей - PullRequest
0 голосов
/ 19 июня 2020

Как мне отсортировать массив объектов, используя значения в массиве desireOrder? Я хочу, чтобы мои объекты массива были отсортированы по ключу type в каждом объекте. Я хочу, чтобы сначала были показаны все элементы фрукты , затем элементы лекарства, , а затем элементы пшеница . Et c. Было бы предпочтительно, если бы функция была многоразовой.

// This is the order I want myList sorted in by the object property type
let desiredOrder = ['fruit', 'drugs', 'wheat', 'candy', 'vegetable', 'dairy']



// Here is my list of objects
let myList = [
    {
        type: "fruit",
        subType: "apple"
    },
    {
        type: "vegetable",
        subType: "carrot"
    },
    {
        type: "fruit",
        subType: "orange"
    },
    {
        type: "dairy",
        subType: "milk"
    },
    {
        type: "wheat",
        subType: "bread"
    },
    {
        type: "vegetable",
        subType: "lettuce"
    },
    {
        type: "fruit",
        subType: "mango"
    },
    {
        type: "drugs",
        subType: 'cocaine'
    },
    {
        type: "vegetable",
        subType: "spinach"
    },
    {
        type: "candy",
        subType: "chocolate"
    },
    {
        type: "vegetable",
        subType: "celery"
    },
    {
        type: "fruit",
        subType: "pineapple"
    },
]




Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вам нужно использовать sort ()

myList.sort((preItem, nextItem) =>
  desiredOrder.indexOf(preItem.type) > desiredOrder.indexOf(nextItem.type) ? 1 : -1
);
1 голос
/ 19 июня 2020

Функция

(a, b) => (desiredOrder.indexOf(a.type) - desiredOrder.indexOf(b.type)) || (a.subType > b.subType ? 1 : -1) || 0;

Сначала будет упорядочивать по порядку, в котором тип находится в массиве, а затем по подтипу, если они имеют тот же тип.

let desiredOrder = ['fruit', 'drugs', 'wheat', 'candy', 'vegetable', 'dairy']



// Here is my list of objects
let myList = [
    {
        type: "fruit",
        subType: "apple"
    },
    {
        type: "vegetable",
        subType: "carrot"
    },
    {
        type: "fruit",
        subType: "orange"
    },
    {
        type: "dairy",
        subType: "milk"
    },
    {
        type: "wheat",
        subType: "bread"
    },
    {
        type: "vegetable",
        subType: "lettuce"
    },
    {
        type: "fruit",
        subType: "mango"
    },
    {
        type: "drugs",
        subType: 'cocaine'
    },
    {
        type: "vegetable",
        subType: "spinach"
    },
    {
        type: "candy",
        subType: "chocolate"
    },
    {
        type: "vegetable",
        subType: "celery"
    },
    {
        type: "fruit",
        subType: "pineapple"
    },
];

const compareTypeThenSubtype = (a, b) => (desiredOrder.indexOf(a.type) - desiredOrder.indexOf(b.type)) || (a.subType > b.subType ? 1 : -1) || 0;

myList.sort(compareTypeThenSubtype);

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