Javascript объекты естественной сортировки - PullRequest
0 голосов
/ 05 октября 2018

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

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, поэтому, пожалуйста, будьте осторожны.

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

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

чувствительность

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

  • "base": только строки, отличающиеся базовыми буквами, сравниваются как неравные.Примеры: a ≠ b, a = á, a = A.
  • "accent": только строки, отличающиеся базовыми буквами или акцентами, и другие диакритические знаки сравниваются как неравные.Примеры: a ≠ b, a ≠ á, a = A.
  • "case": только строки, отличающиеся базовыми буквами или регистром, сравниваются как неравные.Примеры: a ≠ b, a = á, a ≠ A.
  • "variant": строки, которые различаются базовыми буквами, ударениями и другими диакритическими знаками, или регистр сравниваются как неравные.Другие различия также могут быть приняты во внимание.Примеры: a ≠ b, a ≠ á, a ≠ A.

По умолчанию установлено значение "option" для использования "sort";это зависит от локали для использования "search".

numeric

Должен ли использоваться числовой порядок сортировки, например, "1" <"2" <"10".Возможные значения: <code>true и false;по умолчанию false.Эта опция может быть установлена ​​через свойство options или через ключ расширения Unicode;если указаны оба, свойство options имеет приоритет.Реализации не обязаны поддерживать это свойство.

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.log(array)
0 голосов
/ 05 октября 2018

Вот пример использования 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')
0 голосов
/ 05 октября 2018

Вы можете использовать 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.log(arr);
0 голосов
/ 05 октября 2018

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

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

array.sort(function(x, y) {
    return customCompare(x.name, y.name);
});

function customCompare(name1, name2) {
  // The function should return 1, -1, 0 like any other comparator.
}

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...