Сортировать массив по наличию полей в объектах - PullRequest
0 голосов
/ 29 января 2019

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

Итак, существующий массив, например:

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
});

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

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.log(users);
0 голосов
/ 29 января 2019

Вы можете отсортировать по чеку, если свойство существует.В конце сортируйте по 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.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...