为什么这种排序不会生效

时间:2019-03-19 07:50:32

标签: javascript reactjs sorting

我想对对象数组进行排序,如下所示:

  [
        {
            "id": 1,
            "businessEntityId": "BE001",
            "financials": {
                "Npbt": 2323,
                "Interest": 123213,
                "Depreciation": 213123,
                "Ebit": 1312321,
                "EbitDa": 123123,
                "Leasing": 123213
            },
            "type": "Actual",
            "startDate": "2018-06-15T00:00:00.000Z",
            "endDate": "2018-06-15T00:00:00.000Z",
            "model": "Commercial",
            "duration": 12,
            "quality": "Unqualified"
        },
        {
            "id": 2,
            "businessEntityId": "BE002",
            "financials": {
                "Npbt": 2323,
                "Interest": 123213,
                "Depreciation": 213123,
                "Ebit": 1312321,
                "EbitDa": 123123,
                "Leasing": 123213
            },
            "type": "Actual",
            "startDate": "2017-06-15T00:00:00.000Z",
            "endDate": "2017-06-15T00:00:00.000Z",
            "model": "Agribusiness",
            "duration": 12,
            "quality": "Audited"
        },


    ]

我知道如何对日期进行类似的基本排序,但要求却比较严格。这些是desc中的排序规则。优先顺序:

型号: 1,商业 2.农业综合企业

如果modeltype为Commercial,则规则为: 1.类型:质量的实际和顺序:不合格,合格,未经审核。 2.类型:预计,质量顺序:预计,已审核。

如果模型类型为Aggribusiness,则规则为: 1.Type:质量的历史和顺序:不合格,合格,未经审核。 2.类型:实际和质量顺序:预计,经过审核。

就像我说的那样,没有直率的排序,但是谁能帮助我走上正确的道路/我将如何开始解决这个问题?

2 个答案:

答案 0 :(得分:5)

从理论上讲,您可以使用一个对象进行排序,并使用typequality进行排序。

var order = {
        model: { Commercial: 1, Agribusiness: 2 },
        Historical: { Projection: 1, Audited: 2 },
        Actual: { Unqualified: 1, Qualified: 2, Unaudite: 3 },
        BOTTOM: Infinity
    };

array.sort((a, b) =>
    order.model[a.model] - order.model[b.model] ||
    order[a.type][a.quality] - order[b.type][b.quality]
);

对于未知值,您可以添加默认值(取决于位置,例如,-Infinity用于顶部,Infinity用于底部排序),并使用此模式,例如

(order.model[a.model] || order.BOTTOM) - (order.model[b.model] || order.BOTTOM)

要采用这种方法,您需要跳过0对象中的虚假(order)值。

答案 1 :(得分:0)

Array.sort接受比较功能。您可以在compare函数中添加排序逻辑。

const data = []; // Put data here

const sortedData = data.sort((data1,data2)=>{
  // This function should return 1 if data1 > data2,
  // -1 if data2 > data1
  // And 0 if data1 === data2

  if(data1.model==="Commercial"){
    // Code for commercial
  }else{
    // Code for others
  }
})