节点js基于字符串和数字键值对对象数组进行自然排序

时间:2016-08-08 11:29:45

标签: arrays node.js sorting natural-sort

我有一个包含字符串和数值的对象数组。需要一种自然的排序来处理组合值。 例如:

输入数组:

[
{ 
    key1: '156557_08_315F036D',
    key2: 30,
    key3: 's' },
  { 
    key1: '156557_08_315F036D',
    key2: 10,
    key3: 'm' },
 { 
    key1: '156557_08_315F036D',
    key2: 10,
    key3: 's' },
  { 
    key1: '156557_08_315F036D',
    key2: 15,
    key3: 's' },
  { 
    key1: '156557_08_315F036D',
    key2: 20,
    key3: 's' }
]

这应该按照key3 + key1 + key2格式的升序排序,其中只有key2是数字,并且想要自然排序..不作为字符串。

输出将是:

[
{ 
    key1: '156557_08_315F036D',
    key2: 10,
    key3: 'm' },
{ 
    key1: '156557_08_315F036D',
    key2: 10,
    key3: 's' },
{ 
    key1: '156557_08_315F036D',
    key2: 15,
    key3: 's' },
{ 
    key1: '156557_08_315F036D',
    key2: 20,
    key3: 's' },
{ 
    key1: '156557_08_315F036D',
    key2: 30,
    key3: 's' }
]

arr.sort(function (a, b) {
    return (
      a.key3 + a.key1 + parseInt(a.key2) >
      b.key3 + b.key1 +  parseInt(b.key2) ?
      1 :
      ((b.key3 + b.key1 +  parseInt(b.key2) >
        a.key3 + a.key1 +  parseInt(a.key2)) ?
      -1 : 0));
  });

尝试了key2的字符串,但是进行了字符串排序。

3 个答案:

答案 0 :(得分:1)

如果你不介意额外的依赖,这里有一个名为thenBy的酷库:

// first by length of name, then by population, then by ID
data.sort(
    firstBy(function (v) { return v.name.length; })
    .thenBy("population")
    .thenBy("id")
);

这可以通过使用函数或对象属性的键名进行排序。

答案 1 :(得分:0)

我误读了你的问题,你可以使用===运算符。这不会自动转换类型,如' =='运营商。我不确定你要做什么,看起来你希望排序标准基于某些属性顺序。如果是这样,下面的代码就可以了。

function compareFunction(obj1,obj2){
    var ord = ['key3','key1','key2']; //Specify order here 
    for(var i =0;i<ord.length;i++){
        if(obj1[ord[i]] === obj2[ord[i]]){
            continue;
        }
        else{
            if(obj1[ord[i]] < obj2[ord[i]]){
                return -1;
            }
            if(obj1[ord[i]] > obj2[ord[i]]){
                return 1;
            }
        }
    }
return 0;
}

然后只需调用arr.sort(compareFunction);

答案 2 :(得分:0)

我用了Lodash:

const sorted = _.orderBy(arr, ['key3', 'key1', 'key2'], ['asc', 'asc', 'asc']);

太棒了!