使用数组排序对多个键上的对象数组进行排序

sort an array of objects on multiple key using array-sort

我有一个要求,其中对象数组需要按某些键进行排序。需要排序的键是动态的,不是固定的。 我在 npm 库中遇到了数组排序。使用它,我能够对多个键进行排序,但它仅按升序排序。

const input = [{id:'1',name:'John',city:'Denver',State:'CO'},
               {id:'2',name:'Smith',city:'San Fransisco',State:'CA'},
               {id:'3',name:'Adam',city:'Concord',State:'CA'},
               {id:'1',name:'John',city:'Concord',State:'CA'}]

我想按州 (asc)、城市 (asc) 和 id (desc) 排序。我的输出应该看起来像

[
 {id:'3',name:'Adam',city:'Concord',State:'CA'},
 {id:'1',name:'John',city:'Concord',State:'CA'},
 {id:'2',name:'Smith',city:'San Fransisco',State:'CA'}, 
 {id:'1',name:'John',city:'Denver',State:'CO'}]

谁能告诉我如何使用数组排序实现降序排序

谢谢

检查我的代码

function DESC(i, ii) { // DESC
  return (i[key] > ii[key]) ? -1 : ((i[key] < ii[key]) ? 1 : 0);
}

function ASC(i, ii) { // ASC
  return (i[key] > ii[key]) ? 1 : ((i[key] < ii[key]) ? -1 : 0);
}



function StartSort(data, myArray, order) {
  // data - row for sorting, array - array fo sorting, order - order of sorting
  key = data;
  arr = myArray;
  if (order.toUpperCase() == "ASC") {
    sortedArray = arr.sort(ASC);
  } else {
    sortedArray = arr.sort(DESC);
  }
  return sortedArray;
}

//sorting started

const input = [{
    id: '1',
    name: 'John',
    city: 'Denver',
    State: 'CO'
  },
  {
    id: '2',
    name: 'Smith',
    city: 'San Fransisco',
    State: 'CA'
  },
  {
    id: '3',
    name: 'Adam',
    city: 'Concord',
    State: 'CA'
  },
  {
    id: '1',
    name: 'John',
    city: 'Concord',
    State: 'CA'
  }
]



let output1 = StartSort('state', input, 'ASC');
output1 = StartSort('city', output1, 'ASC');
output1 = StartSort('id', output1, 'DESC');



console.log(output1);

也许您想要这样的 JavaScript 功能?

function multicolumnSort(data, orders) {
    return data.sort((e1, e2) => {
        for (var i = 0; i < orders.length; i++)
            if (e1[orders[i].column] != e2[orders[i].column])
                return orders[i].desc ^ e2[orders[i].column] < e1[orders[i].column]? 1 : -1;
        return 0;
    });
}

然后,您可以使用您的命令键调用该函数:

let orders = [
    {
        column: 'State'
    },
    {
        column: 'city'
    },
    {
        column: 'id',
        desc: true
    }
];

let result = multicolumnSort(input, orders);