Сортировка массива по наличию полей в объектах

Как я могу отсортировать массив, как показано ниже, если какое-либо из полей отсутствует?

Например, существующий массив:

const users = [
    {
        id: 1, firstname: 'Jerry'
    }, {
        id: 2, firstname: 'Thomas', lastname: 'Geib'
    }, {
        id: 3
    }, {
        id: 4, lastname: 'Berg'
    }, {
        id: 5, firstname: 'Ass', lastname: 'Noob'
    }, {
        id: 6, lastname: 'Jopa'
    }
]

и результат должен быть отсортирован в следующем порядке:

  1. Объект с firstname и lastname
  2. Объект только с firstname или lastname
  3. Объект без firstname и lastname

чтобы это выглядело так:

    const users = [
        {
            id: 2, firstname: 'Thomas', lastname: 'Geib'
        }, {
            id: 5, firstname: 'Ass', lastname: 'Noob'
        }, {
            id: 1, firstname: 'Jerry'
        }, {
            id: 4, lastname: 'Berg'
        }, {
            id: 6, lastname: 'Jopa'
        }, {
            id: 3
        }
    ]

Я пробовал эту сортировку, но результат не тот, что мне нужен

users.sort((a,b) => {
    if (a.firstname === b.firstname) {
        return 0
    }
    if (!a.firstname) {
        return 1
    }
    return -1
});

на основе чего вы сортируете свой объект?

Nick Parsons 29.01.2019 13:45

фамилия я думаю

ellipsis 29.01.2019 13:46

Я предполагаю, что наименьшее количество значений полей объекта должно быть последним в массиве

Ivan Burnaev 29.01.2019 13:48

Извините, я правда не то написал. я отредактировал вопрос

hofshteyn 29.01.2019 13:50

Вы не проверяете фактические значения

epascarello 29.01.2019 13:50

@hofshteyn ваше редактирование до сих пор не проясняет, что должно произойти, если у 2 пользователей есть и firstname, и lastname?

adiga 29.01.2019 13:50

У меня вопрос: каков ожидаемый порядок после сортировки?

epascarello 29.01.2019 13:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
337
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете отсортировать по чеку, если свойство существует. В конце отсортируйте по id по возрастанию.

const users = [{ id: 1, firstname: 'Jerry' }, { id: 2, firstname: 'Thomas', lastname: 'Geib' }, { id: 3 }, { id: 4, lastname: 'Berg' }, { id: 5, firstname: 'Ass', lastname: 'Noob' }, { id: 6, lastname: 'Jopa' }];

users.sort((a, b) => 
    ('firstname' in b && 'lastname' in b ) - ('firstname' in a && 'lastname' in a) ||
    ('firstname' in b) - ('firstname' in a) ||
    ('lastname' in b) - ('lastname' in a) ||
    a.id - b.id
);

console.info(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ принят как подходящий

Что ж, просто подсчитайте количество свойств, которыми обладает каждый элемент, и отсортируйте по этому числу в порядке убывания:

var users = [
  {id: 1,firstname: 'Jerry'}, 
  {id: 2,firstname: 'Thomas', lastname: 'Geib'}, 
  {id: 3}, 
  {id: 4,lastname: 'Berg'}, 
  {id: 5,firstname: 'Ass',lastname: 'Noob'}, 
  {id: 6,lastname: 'Jopa'}
];
users.sort(function(a, b) {
  var aw = ('firstname' in a) + ('lastname' in a);
  var bw = ('firstname' in b) + ('lastname' in b);
  return bw - aw;
});
console.info(users);

Другие вопросы по теме