В javascript, я могу создать функцию сортировки, которая помещает верхние 10 счетчиков сверху, отсортированные по алфавиту?

У меня есть набор цветов и количество продуктов, найденных в этом цвете:

[
  {colour: 'red', count: 100},
  {colour: 'green', count: 30},
  {colour: 'blue', count: 80},
  ...
]

Список намного длиннее, чем этот. Я хочу:

  • чтобы показать лучшие десять цветов с наибольшим количеством в верхней части списка,
  • но отсортируйте эти 10 лучших по алфавиту.

Я могу использовать только JS CompareFunction, один раз. Есть ли способ добиться этого?


Кроме того, я пытаюсь получить этот результат сортировки при использовании уточняющего списка библиотеки Algolia InstantSearch. Как задокументировано, sortBy может принимать только одну функцию сортировки. Если у кого-то есть другое решение для этого, то этого, конечно, также будет достаточно.

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

6 ответов

Это будет сортировать независимо от количества после определения лучших 'n' записей. Таким образом, упорядоченный по убыванию, он будет затем повторно отсортирован в этом нарезанном массиве, используя свойство объекта второго динамического массива colour заказать по алфавиту:

// example array:
const Arr = [
    {colour: 'blue', count: 10},
    {colour: 'red', count: 100},
    {colour: 'red', count: 101},
    {colour: 'green', count: 30},
    {colour: 'green', count: 40},
    {colour: 'blue', count: 100},
    {colour: 'white', count: 40},
    {colour: 'orange', count: 40}
];

// multiple sort function:
const orderedCollection = (arr, n, ...props) => {
  return arr
   // create a copy of the array
   .slice(0)
        // sort by descending order i.e "count"
        .sort((a, b) => b[props[0]] - a[props[0]])
        // take 'n' number of records i.e 5
        .slice(0, n)
        // sort alphabetically (a-z), based on property i.e "colour"
        .sort((a, b) => {
        if (a[props[1]] < b[props[1]]) return -1;
        if (a[props[1]] > b[props[1]]) return 1;
        return 0;
     });
};

// top 5, using props count & colour.
orderedCollection(Arr, 5, "count", "colour")
 .forEach((obj, index) => { 
           // example output:
           console.log(`${index +1}. ${obj.colour} - ${obj.count}`);
         });

Шаг 1: Используйте метод Array.sort()

сортировка элементов массива (объектов) по их количеству (по убыванию). Вот функция сравнения, которая делает это :

var sortByCount = jsonObj.sort(function(a, b) {
    return b.count - a.count;
});

Вот, jsonObj это исходный массив объектов, который unsorted,

Шаг 2: Используйте Array.slice(), чтобы получить 10 лучших записей из отсортированного массива

Синтаксис: array.slice(start, end)

var sortByCount = jsonObj.sort(function(a, b) {
    return b.count - a.count;
});

var topTen = sortByCount.slice(0,10);

Шаг 3: Снова отсортируйте первые 10 записей по алфавиту в порядке возрастания.

var sortByCount = jsonObj.sort(function(a, b) {
    return b.count - a.count;
});

var topTen = sortByCount.slice(0,10);

var sortByName = topTen.sort(function(a, b) {
    if(a.colour < b.colour) return -1;
    if(a.colour > b.colour) return 1;
    return 0;
});

Рабочая Демо

var jsonObj = [
  {colour: 'red', count: 100},
  {colour: 'green', count: 30},
  {colour: 'zlue', count: 40},
  {colour: 'dlue', count: 90},
  {colour: 'ylue', count: 20},
  {colour: 'blue', count: 25},
  {colour: 'jlue', count: 45},
  {colour: 'klue', count: 2556},
  {colour: 'slue', count: 46},
  {colour: 'xlue', count: 745},
  {colour: 'qlue', count: 76},
  {colour: 'tlue', count: 65}
];

var sortByCount = jsonObj.sort(function(a, b) {
    return b.count - a.count;
});

var topTen = sortByCount.slice(0,10);

var sortByName = topTen.sort(function(a, b) {
    if(a.colour < b.colour) return -1;
    if(a.colour > b.colour) return 1;
    return 0;
});

console.log(sortByName);

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

Результат содержит все элементы, десять главных элементов первой части, упорядоченные name а остальное тоже упорядочено по имени, но не по первому.

var data = [{ colour: 'red', count: 100 }, { colour: 'green', count: 30 }, { colour: 'blue', count: 80 }, { colour: 'white', count: 40 }, { colour: 'black', count: 5 }, { colour: 'pink', count: 8 }, { colour: 'yellow', count: 99 }, { colour: 'cyan', count: 37 }, { colour: 'magenta', count: 32 }, { colour: 'grey', count: 23 }, { colour: 'mint', count: 13 }, { colour: 'brown', count: 18 }, { colour: 'orange', count: 1 }, { colour: 'x', count: 0 }, { colour: 'b', count: -1 }, { colour: 'a', count: -2 }, { colour: 'y', count: -4 }],
    count = data.reduce(function (r, a, i) {
        var min;
        if (r.length < 10) {
            return r.concat(a.count);
        }
        min = Math.min(...r);
        if (a.count > min) {
            r[r.indexOf(min)] = a.count;
        }
        return r;
    }, []);

data.sort(function (a, b) {
    return count.includes(b.count) - count.includes(a.count) || a.colour.localeCompare(b.colour);
});

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

var arr = [
  {colour: 'red', count: 100},
  {colour: 'green', count: 30},
  {colour: 'blue', count: 80},
  {colour: 'red', count: 17},
  {colour: 'green', count: 50},
  {colour: 'blue', count: 8},
  {colour: 'red', count: 16},
  {colour: 'green', count: 45},
  {colour: 'blue', count: 35},
  {colour: 'red', count: 15},
  {colour: 'green', count: 25},
  {colour: 'blue', count: 20},
  {colour: 'red', count: 10},
  {colour: 'green', count: 40},
  {colour: 'blue', count: 70}
]
arr.sort(function(a, b) {
   return  b['count'] - a['count'];
})
arr.splice(10)
arr.sort(function(a, b) {
  var nameA = a.colour.toUpperCase(); // ignore upper and lowercase
  var nameB = b.colour.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }
// names must be equal
  return 0;
});
console.log(arr);

скриптовая ссылка

Это должно дать некоторое представление о том, как вы можете сортировать пользовательские массивы. если вы поменяете местами a и b, вы разберетесь в противоположном направлении.

да, я знаю, что вы сказали, что хотите использовать только один вызов функции сравнения, но, честно говоря... если проф заставляет вас сделать это, вы можете подумать о переключении курсов или заставить его понять, что его идиология глупа для практического использования,

в конце концов, stackru не предназначен для ответа на вопросы, которые не имеют отношения к неэффективным сценариям использования.

[
  {colour: 'red', count: 100},
  {colour: 'green', count: 30},
  {colour: 'blue', count: 80},
  {colour: 'pink', count: 1337},
  {colour: 'black', count: 10},
  {colour: 'orange', count: 101}
]
// sort by count
.sort((a, b) => b.count - a.count)
// extract first three colours
.splice(0, 3)
// sort by text
.sort((a, b) => a.colour > b.colour ? 1 : a.colour < b.colour ? -1 : 0)
// print the result into the console
.forEach((x, i) => console.log(`${['first', 'second', 'third'][i]}: ${x.colour}`));

Для этого сначала вам нужно использовать функцию сортировки массива по числу (числа), а затем по цвету (текст). Чтобы получить верхние данные, вы можете использовать массив ломтик. Просто обратитесь к основным функциям JavaScript и попробуйте сами. Смотрите ниже код:

<script type="text/javascript">
        var colorsarray = [
                            {colour: 'red', count: 100},
                            {colour: 'green', count: 30},
                            {colour: 'blue', count: 80},
                            {colour: 'yellow', count: 60},
                            {colour: 'purple', count: 50},
                            {colour: 'pink', count: 10},
                            {colour: 'brown', count: 90},
                            {colour: 'black', count: 70},
                            {colour: 'white', count: 20},
                            {colour: 'gold', count: 110},
                            {colour: 'silver', count: 150},
                            {colour: 'orange', count: 130},
                            {colour: 'grey', count: 40},
        ];

        colorsarray.sort(function(a, b){
            return a.count-b.count
        });

        colorsarray.sort(function(a, b){
            var name1=a.colour.toLowerCase(), 
            var name2=b.colour.toLowerCase(),
            if (name1 < name2)
                return -1 
            if (name1 > name2)
                return 1
            return 0
        });

        console.log(colorsarray.slice(1,10));
    </script>
Другие вопросы по тегам