Javascript: сложная сортировка массива объектов (пример и предполагаемый результат в посте) - PullRequest
2 голосов
/ 04 мая 2020

скажем, у меня есть массив объектов, который структурирован, как показано ниже:

let fruits = [
 {type: 'apple', count:1},
 {type: 'apple', count:2},
 {type: 'apple', count:3},
 {type: 'orange', count:2},
 {type: 'orange', count:3},
 {type: 'orange', count:4},
 {type: 'banana', count:3},
 {type: 'banana', count:4}
]

Я пытаюсь отсортировать массив сначала по типу, а затем по количеству. Тем не менее, я хочу сделать это партиями. Таким образом, отсортированный массив сначала будет показывать наименьшее количество записей для каждого типа фруктов, чьи заказы отсортированы по типу, а затем - наименьшее количество записей, и т. Д. c ... Результат должен быть таким, как показано ниже:

let fruits = [
 {type: 'apple', count:1},
 {type: 'banana', count:3},
 {type: 'orange', count:2},
 {type: 'apple', count:2},
 {type: 'banana', count:4},
 {type: 'orange', count:3},
 {type: 'apple', count:3},
 {type: 'orange', count:4}
]

Один из способов, о котором я могу подумать, - это создать новые массивы из исходного массива, включающие в себя наименьшие значения, вторые наименьшие значения и т. Д. c ..., а затем использовать массивы для создания нового массива. в предполагаемом порядке, но, похоже, это будет сложный код, и интересно, что будет лучшим способом сделать это.

Есть предложения / идеи? Заранее большое спасибо!

1 Ответ

3 голосов
/ 04 мая 2020

Вы можете отсортировать массив заранее по

  • type по возрастанию,
  • count по возрастанию

и затем взять объект для порядок того же type как group и получить массив index, group и object.

После сортировки сопоставьте object как результат.

let fruits = [{ type: 'apple', count: 1 }, { type: 'apple', count: 2 }, { type: 'apple', count: 3 }, { type: 'orange', count: 2 }, { type: 'orange', count: 3 }, { type: 'orange', count: 4 }, { type: 'banana', count: 3 }, { type: 'banana', count: 4 }],
    groups = Object.create(null),
    result = fruits
        .sort((a, b) => a.type.localeCompare(b.type) || a.count - b.count)
        .map((object, index) => ({ index, group: groups[object.type] = (groups[object.type] || 0) + 1, object }))
        .sort((a, b) => a.group - b.group || a.index - b.index)
        .map(({ object }) => object);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...