Search code examples
javascriptsortinglodash

Lodash - Move object to first place in array than sort by another property


I have an array of object employees

enter image description here

    {
  "emp1": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : true,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp2": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : true,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp3": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp4": {
    "BusinessPartnerFormattedName": " Lewandowski",
    "EmpRoleCode": "BUP803",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP803",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp5": {
    "BusinessPartnerFormattedName": "Aleksandra",
    "EmpRoleCode": "BUP043",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP043",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp6": {
    "BusinessPartnerFormattedName": "Eva Log",
    "EmpRoleCode": "BUP0d03",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP0d03",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  }
}

I would like to put the employee where EmployeeID is equal to E8000 first in list , than I want the employee where isAssigned is equal to true to follow

So far I've achieved this :

var sortedItems = _.sortBy(items, function(item) {
  return (item.isAssigned === true || item.EmployeeID === "E8000") ? 0 : 1;
});

But how to make sure that the emp with EmployeeID is equal E8000 to will always be on top ?


Solution

  • You chain the wanted sort order.

    var array = [
            { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
            { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
            { name: "E8003 false", EmployeeID: "E8003", isAssigned : false },
            { name: "E8001 true", EmployeeID: "E8001", isAssigned : true },
            { name: "E8002 true", EmployeeID: "E8002", isAssigned : true },
            { name: "E8001 false", EmployeeID: "E8001", isAssigned : false }
        ];
    
    array.sort((a, b) => 
        (b.EmployeeID === 'E8000') - (a.EmployeeID === 'E8000') ||
        b.isAssigned - a.isAssigned
    );
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    With lodash

    var array = [
            { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
            { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
            { name: "E8003 false", EmployeeID: "E8003", isAssigned : false },
            { name: "E8001 true", EmployeeID: "E8001", isAssigned : true },
            { name: "E8002 true", EmployeeID: "E8002", isAssigned : true },
            { name: "E8001 false", EmployeeID: "E8001", isAssigned : false }
        ];
    
    console.log(_.sortBy(array, [
        o => o.EmployeeID !== 'E8000',
        o => !o.isAssigned
    ]));
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>