Объекты естественной сортировки Javascript

У меня есть массив объектов вроде

array[0] = {id: 1, name: "First"}
array[1] = {id: 2, name: "Second"}

Который я пытался отсортировать по полю name, используя:

Array.prototype.alphanumSort = function (caseInsensitive) {
for (var z = 0, t; t = ((typeof this[z] == "string" || typeof this[z] == "undefined") ? this[z] : this[z].name); z++) {
    this[z] = new Array();
    var x = 0, y = -1, n = 0, i, j;

    while (i = (j = t.charAt(x++)).charCodeAt(0)) {
        var m = (i == 46 || (i >= 48 && i <= 57));
        if (m !== n) {
            this[z][++y] = "";
            n = m;
        }
        this[z][y] += j;
    }
}

this.sort(function (a, b) {
    for (var x = 0, aa, bb; (aa = a[x]) && (bb = b[x]); x++) {
        if (caseInsensitive) {
            aa = aa.toLowerCase();
            bb = bb.toLowerCase();
        }
        if (aa !== bb) {
            var c = Number(aa), d = Number(bb);
            if (c == aa && d == bb) {
                return c - d;
            } else return (aa > bb) ? 1 : -1;
        }
    }
    return a.length - b.length;
});

for (var z = 0; z < this.length; z++)
    this[z] = this[z].join("");
}

но список, который я получаю от него, содержит массив только с полем name из него, без соответствующего id. Почему это происходит? Есть ли способ применить этот алгоритм для фильтрации объектов? Я новичок в JavaScript, поэтому будьте осторожны.

Вы смотрели String#localeCompare и его параметры?

Nina Scholz 05.10.2018 09:31
пожалуйста не помещает методы в цепочку прототипов
Ayush Gupta 05.10.2018 09:31

это нормально @AyushGupta - OP никогда не ИСПОЛЬЗУЕТ этот код

Jaromanda X 05.10.2018 10:12

@NinaScholz Что делать, если у меня есть такие ситуации, как «Пример 10» и «Пример 2»? Второй должен быть первым

Dana 05.10.2018 10:16
Поведение ключевого слова "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) для оценки ваших знаний,...
3
4
2 415
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот пример использования Lodash (https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js):

array[0] = {id: 1, name: "First"}
array[1] = {id: 2, name: "Second"}
array = _.orderBy(array, 'name', 'desc')

Вы можете использовать String.prototype.localeCompare

var arr = [
    {id: 1, name: "Third"},
    {id: 2, name: "Fifth"},
    {id: 3, name: "Second"},
    {id: 4, name: "Fourth"},
    {id: 5, name: "First"}
];

arr.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }));

console.info(arr);

В таких ситуациях, как сортировка имен, таких как "Первые 10" и "Первые 2", второе должно быть первым.

Dana 05.10.2018 10:15

Если бы в каком-то объекте не было свойства name, ваш код сравнивал бы другие строки со строкой "undefined".

barbsan 05.10.2018 10:17

В этом случае я бы предложил создать настраиваемую функцию для сравнения двух строк, которая возвращает 1, -1, 0 в Array.sort (), как предложено ниже vizsatiz. Я постараюсь это сделать и обновлю свой ответ, если у меня будет немного свободного времени.

PR7 05.10.2018 10:24

@ PR7 нет необходимости в пользовательской функции, см. другой ответ

barbsan 05.10.2018 10:30

@Dana Нет необходимости писать собственную функцию сравнения. Вы можете использовать параметры в функции localeCompare. Я обновил свой ответ. barbsan Спасибо :)

PR7 05.10.2018 11:31

@ PR7 Почему вы также используете внутреннюю функцию .sort?

Dana 09.10.2018 12:51

@Dana Извините, я был занят и забыл правильно обновить код. Я исправил это сейчас.

PR7 14.10.2018 08:02
Ответ принят как подходящий

Вы можете использовать сортировка с картой и String#localeCompare с options

sensitivity

Which differences in the strings should lead to non-zero result values. Possible values are:

  • "base": Only strings that differ in base letters compare as unequal. Examples: a ≠ b, a = á, a = A.
  • "accent": Only strings that differ in base letters or accents and other diacritic marks compare as unequal. Examples: a ≠ b, a ≠ á, a = A.
  • "case": Only strings that differ in base letters or case compare as unequal. Examples: a ≠ b, a = á, a ≠ A.
  • "variant": Strings that differ in base letters, accents and other diacritic marks, or case compare as unequal. Other differences may also be taken into consideration. Examples: a ≠ b, a ≠ á, a ≠ A.

The default is "variant" for usage "sort"; it's locale dependent for usage "search".

numeric

Whether numeric collation should be used, such that "1" < "2" < "10". Possible values are true and false; the default is false. This option can be set through an options property or through a Unicode extension key; if both are provided, the options property takes precedence. Implementations are not required to support this property.

var array = ['Ex 10', 'Ex 2', 'a 10.1', 'a 1.1', 'a 10.0', 'a 2.0'];

array.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' }));

console.info(array)

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