【问题标题】:How to sort an array of objects by one of the objects string values numerically?如何按对象字符串值之一对对象数组进行数字排序?
【发布时间】:2015-10-23 19:22:55
【问题描述】:

我有一个类似的对象数组:

 var this array = [
    { 
    "id" : "A20",
    "age" : "16"
    },
    {
    "id" : "A2",
    "age" : "12"
    },
    { 
    "id" : "B16",
    "age" : "45"
    }]

我需要按他们的 ID 对这个数组进行排序,所以它最终会像:

this array = [
        { 
        "id" : "A2",
        "age" : "12"
        },
        {
        "id" : "A20",
        "age" : "16"
        },
        { 
        "id" : "B16",
        "age" : "45"
        }]

我有这种排序方法:

nodes.sort(function(a,b){
    // console.log(a.Pos)
    // console.log(a.pinNum)
    var alc = a.id, blc = b.id;
    console.log(alc)
    return alc > blc ? 1 : alc < blc ? -1 : 0;
    });

但这只能按字母顺序工作。我也发现了这个,但它只返回我传递给函数的字符串,而不是对象数组:

function sortArray(arr) {
        var tempArr = [],
        n;
        console.log(arr)
        for (var i in arr) {

            var thisString = arr[i].id;

            // tempArr[i] = arr[i].match(/([^0-9]+)|([0-9]+)/g);
            tempArr[i] = thisString.match(/([^0-9]+)|([0-9]+)/g);
            for (var j in tempArr[i]) {
                if (!isNaN(n = parseInt(tempArr[i][j]))) {
                    tempArr[i][j] = n;
                }
            }
        }
        tempArr.sort(function (x, y) {
            for (var i in x) {
                if (y.length < i || x[i] < y[i]) {
                    return -1; // x is longer
                }
                if (x[i] > y[i]) {
                    return 1;
                }
            }
            return 0;
        });
        for (var i in tempArr) {
            arr[i] = tempArr[i].join('');
        }
        return arr;
    }
    console.log(sortArray(nodes).join(","));

我需要的是第二个排序功能,但能够按字母和数字排序。谢谢

【问题讨论】:

  • var alc = +a.id, blc = +b.id;
  • @dandavis 你能解释一下你的观点吗?
  • @dandavis 但我的字符串由字母和数字组成? “A20” ...
  • oooooops,我应该仔细阅读它,抱歉。
  • 告诉我们更多关于比较规则的信息,它只是简单地删除任何前缀非数字吗?还是有其他规定?

标签: javascript jquery arrays sorting


【解决方案1】:
var array = [{ 
   "id" : "A20",
   "age" : "16"
}, {
   "id" : "A2",
   "age" : "12"
}, { 
   "id" : "B16",
   "age" : "45"
}];

array.sort(function(a, b) {
 var aSplit = /(\D*)(\d*)/.exec(a.id),
     bSplit = /(\D*)(\d*)/.exec(b.id);

 if( aSplit[1] !== bSplit[1] )
    return aSplit[1].localeCompare(bSplit[1]);
 else
    return aSplit[2] - bSplit[2];
});

【讨论】:

  • 不错的答案,但它不起作用。如果我有这些作为 id:'A1','A20','A11','A'2。排序后的输出为:'A1','A11','A2','A20'
  • 错误,如果您将 id 'A2' 更改为 'A120',则会收到错误的订单
  • 然后你必须拆分,比较字母和数字。
  • 我想了很多 :( 感谢您的输入。我会尝试拆分并回答问题,如果您设法解决问题,请选择您的作为正确答案 :)
  • 它是“localeCompare”(带有“e”),但它不会帮助解决这里的混合字母和数字问题...
【解决方案2】:

在数组中使用函数.sort,并传递有参数,一个回调。

这个回调接收元素进行迭代,你可以比较值,如果返回true,切换元素的顺序,即:

arr.sort(function(a, b) {
    return parseInt(a.age) > parseInt(b.age))
};

或者,如果你使用ecma script 6,你可以使用箭头函数,更好,即如下:

arr.sort((a, b) => parseInt(a.age) > parseInt(b.age))

这里的文档: http://www.w3schools.com/jsref/jsref_sort.asp

【讨论】:

  • 我要排序的不是年龄,是ID
【解决方案3】:

我认为您可以使用 localeCompare() 来比较字符串。试试这段代码,它应该可以工作:

nodes.sort(function(a,b){
    // console.log(a.Pos)
    // console.log(a.pinNum)
    var alc = a.id, blc = b.id;
    console.log(alc)
    return alc.localeCompare(blc);
});

【讨论】:

    猜你喜欢
    • 2020-05-24
    • 2016-10-08
    • 2021-06-27
    相关资源
    最近更新 更多