按多个条件对对象数组进行排序

时间:2020-08-06 06:21:46

标签: javascript sorting ecmascript-6

实际上,我正在寻找一种解决方案,可以在其中对这些对象进行排序

 tempArr =[
      {
      BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "4",
    Chanage_From_M: "023",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition" },
      {
      BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: undefined,
    Chanage_From_M: undefined,
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "LHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Deduction"
    },
      {
      BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: undefined,
    Chanage_From_M: undefined,
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Deduction"
    },
      {
      BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "0",
    Chanage_From_M: "000",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition"},
      {
      BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "0",
    Chanage_From_M: "023",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "LHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition"}
    ] 
    tempArr.sort(function (vote1, vote2) {
      const from = vote1.Chanage_From_KM + ',' + vote1.Chanage_From_M;
        const from2 = vote2.Chanage_From_KM + ',' + vote2.Chanage_From_M;
      
        if ( vote1.calculation_type.length  <  vote2.calculation_type.length) {
        if(vote1.side === vote2.side){
          return -3;
        }
      }
      if ( vote1.calculation_type.length  >  vote2.calculation_type.length){
         if(vote1.side === vote2.side) {
           return 1;
         }
      }
      if ( from  <  from2) return -1;
    });

我要按->

排序该数组
  • LHS->加法->从束缚(从低到高)
  • RHS->加法->从束缚(从低到高)
  • LHS->扣除
  • RHS->扣除

简而言之,我想检查一下它的属性calculation_type是否为“ Addition”,而属性方是否为“ LHS”,那么它将首先以升序排列属性Chainage_from_KM + Chainage_from_M。 如果Property Side是'RHS',它将出现在所有LHS-添加列表之后,那么property Calculation_type是'Deduction'将会是第一个'LHS'到最后一个'RHS'。

如果感谢,请分享您的想法。

1 个答案:

答案 0 :(得分:0)

我希望我已经正确理解了你。如果第一个排序标准相同,则多重排序必须返回1或-1,请检查第二个..第三个.. N个。

tempArr = [{
    BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "4",
    Chanage_From_M: "023",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition"
}, {
    BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: undefined,
    Chanage_From_M: undefined,
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "LHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Deduction"
}, {
    BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: undefined,
    Chanage_From_M: undefined,
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Deduction"
}, {
    BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "0",
    Chanage_From_M: "000",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "RHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition"
}, {
    BOQ_Txn_ID: 1456,
    Chanage_At_KM: undefined,
    Chanage_At_M: undefined,
    Chanage_From_KM: "0",
    Chanage_From_M: "023",
    Chanage_To_KM: "2",
    Chanage_To_M: "003",
    Date: "1/Aug/2020",
    Hight_Thikness: "1.000",
    Item_Code: "HOT TACK COAT",
    Loose_Qty_Per_Trip: undefined,
    No_Of_Trip: undefined,
    QNTY: "1980.000",
    Side: "LHS",
    Total_Length: "1.980",
    Total_Loose_Qty: undefined,
    Trip_Arr: [],
    Trip_By: undefined,
    Type_of_Work: "Road Works",
    UNIT: "Sqm",
    Width: "1.000",
    calculation_type: "Addition"
}];

tempArr.sort((first, second) => {
    // calculation_type sort from Addition to Deduction
    if (
        first.calculation_type === 'Addition'
        && second.calculation_type === 'Deduction'
    ) {
        return -1;
    }

    if (
        first.calculation_type === 'Deduction'
        && second.calculation_type === 'Addition'
    ) {
        return 1;
    }

    // Side sort from LHS to RHS
    if (
        first.Side === 'LHS'
        && second.Side === 'RHS'
    ) {
        return -1;
    }

    if (
        first.Side === 'RHS'
        && second.Side === 'LHS'
    ) {
        return 1;
    }

    // Chainage_from_KM + Chainage_from_M
    
    const firstChaninAgeFrom = parseInt(first.Chainage_from_KM + first.Chainage_from_M, 10);
    const secondChaninAgeFrom = parseInt(second.Chainage_from_KM + second.Chainage_from_M, 10);

    if (firstChaninAgeFrom > secondChaninAgeFrom) {
        return -1;
    }

    if (firstChaninAgeFrom < secondChaninAgeFrom) {
        return 1;
    }

});
console.log(JSON.stringify(tempArr, null, ' '));