【问题标题】:Node js natural sort on array of objects based on string and numeric key valuesNode js基于字符串和数字键值对对象数组进行自然排序
【发布时间】:2016-08-08 11:29:45
【问题描述】:

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

输入数组:

[
{ 
    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的toString,但做了字符串排序。

【问题讨论】:

  • 好的。你的代码在哪里?
  • 添加到问题@str

标签: arrays node.js sorting natural-sort


【解决方案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")
);

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

【讨论】:

    【解决方案2】:

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

    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);

    【讨论】:

      【解决方案3】:

      我使用了 Lodash:

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

      太棒了!

      【讨论】:

      • 注意:lodash 不进行自然排序。
      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2013-03-06
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多