Подтвердить что ты не робот

Сортировка массива по первому (в алфавитном порядке) в Javascript

Я получил массив (см. ниже для одного объекта в массиве), который мне нужно отсортировать по первому имени с помощью JavaScript. Как я могу это сделать?

var user = {
   bio: null,
   email:  "[email protected]",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};
4b9b3361

Ответ 1

Предположим, у вас есть users массива. Вы можете использовать users.sort и передать функцию, которая принимает два аргумента и сравнивает их (компаратор)

Он должен вернуться

  • что-то отрицательное, если первый аргумент меньше второго (должен быть помещен перед вторым в результирующем массиве)
  • что-то положительное, если первый аргумент больше (должен быть помещен после второго)
  • 0, если эти два элемента равны.

В нашем случае, если два элемента: a и b мы хотим сравнить имя a.firstname и b.firstname

Пример:

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

Этот код будет работать с любым типом.

Обратите внимание: в "реальной жизни" ™ вы часто хотите игнорировать случай, правильно сортируете диакритические символы, странные символы, такие как ß и т.д., Когда вы сравниваете строки, поэтому вы можете использовать localeCompare. См. Другие ответы для ясности.

Ответ 2

Что-то вроде этого:

array.sort(function(a, b){
 var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();
 if (nameA < nameB) //sort string ascending
  return -1;
 if (nameA > nameB)
  return 1;
 return 0; //default return value (no sorting)
});

Ответ 3

Если строки сравнения содержат символы Юникода, вы можете использовать localeCompare функцию класса String следующим образом:

users.sort(function(a,b){
    return a.firstname.localeCompare(b.firstname);
})

Ответ 4

Самый короткий возможный код с ES6!

users.sort((a, b) => a.firstname.localeCompare(b.firstname))

String.prototype.localeCompare() базовая поддержка универсальна!

Ответ 5

Хороший маленький ES6 один вкладыш:

users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);

Ответ 6

Мы можем использовать localeCompare, но нужно также проверять ключи для значений false

Код ниже не будет работать, если в одной записи отсутствует lname.

obj.sort((a, b) => a.lname.localeCompare(b.lname))

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

let obj=[
{name:'john',lname:'doe',address:'Alaska'},
{name:'tom',lname:'hopes',address:'California'},
{name:'harry',address:'Texas'}
]
let field='lname';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));

Ответ 7

underscorejs предлагает очень приятную функцию _.sortBy:

_.sortBy([{a:1},{a:3},{a:2}], "a")

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

_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})

Ответ 8

В принципе, вы можете сортировать массивы с сортировкой метода, но если вы хотите сортировать объекты, вам нужно передать функцию для сортировки метода массива, поэтому я приведу вам пример с использованием вашего массива

user = [{
bio: "<null>",
email: "[email protected]",
firstname: 'Anna',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "[email protected]",
firstname: 'Senad',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "[email protected]",
firstname: 'Muhamed',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
}];

var ar = user.sort(function(a, b)
{
  var nA = a.firstname.toLowerCase();
  var nB = b.firstname.toLowerCase();

  if(nA < nB)
    return -1;
  else if(nA > nB)
    return 1;
 return 0;
});

Ответ 9

В случае, если мы сортируем имена или что-то со специальными символами, такими как ñ или áéíóú (обыкновенные по-испански), мы могли бы использовать параметры params locales (в данном случае es для испанского языка) и такие параметры:

let user = [{'firstname': 'Az'},{'firstname': 'Áb'},{'firstname':'ay'},{'firstname': 'Ña'},{'firstname': 'Nz'},{'firstname': 'ny'}];


user.sort((a, b) => a.firstname.localeCompare(b.firstname, 'es', {sensitivity: 'base'}))


console.log(user)

Ответ 10

Вдохновленный этим ответом,

users.sort((a,b) => (a.firstname  - b.firstname));

Ответ 11

также для asec и desc sort, вы можете использовать это: предположим, у нас есть переменная SortType, которая указывает сортировку по возрастанию или по убыванию, которую вы хотите:

 users.sort(function(a,b){
            return   sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare(  b.firstName));
        })

Ответ 12

Обобщенная функция может быть написана как ниже

    function getSortedData(data, prop, isAsc) {
        return data.sort((a, b) => (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1));
   }

Вы можете передать следующие параметры

  1. Данные, которые вы хотите отсортировать
  2. Свойство в данных по нему должно быть отсортировано
  3. Последний параметр имеет логический тип. Он проверяет, хотите ли вы сортировать по возрастанию или по убыванию

Ответ 13

Более компактная запись:

user.sort(function(a, b){
    return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})

Ответ 14

Вы можете использовать это для объектов

transform(array: any[], field: string): any[] {
return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}

Ответ 15

Поместил верхние ответы в прототип для сортировки по ключу.

Array.prototype.alphaSortByKey= function (key) {
    this.sort(function (a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    });
    return this;
};

Ответ 16

Вы можете использовать встроенный метод массива - sort. Этот метод принимает метод обратного вызова в качестве параметра



    // custom sort function to be passed as param/callback to the Array sort method
    function myCustomSort(a, b) {
        return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
    }

    // Actual method to be called by entity that needs sorting feature
    function sortStrings() {
        var op = Array.prototype.sort.call(arguments, myCustomSort);
    }

    // Testing the implementation
    var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
    console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]


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

  • Пользовательский метод в этом случае myCustomSort должен возвращать +1 или -1 для каждой пары элементов (из входного массива).
  • Используйте метод toLowerCase()/toUpperCase() в методе обратного вызова выборочной сортировки, чтобы разность случаев не влияла на правильность процесса сортировки.

Надеюсь, это достаточно ясное объяснение. Не стесняйтесь комментировать, если вы думаете, требуется дополнительная информация.

Ура!

Ответ 17

в простых словах вы можете использовать этот метод

users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});

Ответ 18

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

users.sort(function(a, b){

  //compare two values
  if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
  if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
  return 0;

})

Ответ 19

пытаться

users.sort((a,b)=> (a.firstname>b.firstname)*2-1)

var users = [
  { firstname: "Kate", id: 318, /*...*/ },
  { firstname: "Anna", id: 319, /*...*/ },
  { firstname: "Cristine", id: 317, /*...*/ },
]

console.log(users.sort((a,b)=> (a.firstname>b.firstname)*2-1) );