JavaScript自然排序对象

时间:2018-10-05 07:29:10

标签: javascript arrays sorting object

我有一个像这样的对象数组

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 :(得分:2)

您可以将sorting with mapString#localeCompareoptions一起使用

  

敏感性

     

字符串中的哪些差异应导致非零结果值。可能的值为:

     
      
  • "base":仅将基本字母不同的字符串视为不相等。示例:a ≠ ba = áa = A
  •   
  • "accent":仅将基本字母或重音和其他音标不同的字符串视为不相等。示例:a ≠ ba ≠ áa = A
  •   
  • "case":仅将基本字母或大小写不同的字符串视为不相等。示例:a ≠ ba = áa ≠ A
  •   
  • "variant":基本字母,重音和其他变音符号或大小写不同的字符串比较不相等。也可以考虑其他差异。示例:a ≠ ba ≠ áa ≠ A
  •   
     

对于用法“ sort”,默认值为“ variant”;它取决于使用“搜索”的语言环境。

     

数字

     

是否应使用数字排序规则,例如“ 1” <“ 2” <“ 10”。可能的值为truefalse;默认值为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)

答案 1 :(得分:1)

您可以使用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);

答案 2 :(得分:0)

您可以将比较器函数传递给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.
}

希望这会有所帮助!

答案 3 :(得分:0)

以下是使用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')