I have an array of object employees
{
"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 ?
Not sure why you need lodash on this:
items.sort((a,b)=>{
if(a.EmployeeID !== b.EmployeeID){
if(a.EmployeeID === 'E8000') return -1;
if(b.EmployeeID === 'E8000') return 1;
};
if(a.isAssigned !== b.isAssigned){
return a.isAssigned ? -1 : 1;
}
//Remaining sort logic...
})
This translates to:
"When deciding if a
or b
should come first, if a
and b
don't both have the same EmployeeID value, check if either has value E8000
. If ether one does have that value, put that one first.
Otherwise, check if a
and b
have the same value for isAssigned
, if they don't, put the one that has true
as the isAssigned
value first.
Finally if the prior conditions weren't met, follow whatever logic you want for setting which should go first.
Of course, you have to fill in whatever sort logic you want to come after that. For example, if you want to sort alphabetically on BusinessPartnerFormattedName
, you'd fill that Remaining sort logic...
block with:
if(a.BusinessPartnerFormattedName < b.BusinessPartnerFormattedName) return -1;
if(a.BusinessPartnerFormattedName > b.BusinessPartnerFormattedName) return 1;
return 0;
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>
The data you provided is highly misleading, however I still would like to publish my solution, because basically I just like it.
const items = [{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E7000",isAssigned:!0,ObjectID:"00163E0E46241ED7A0EA0590D0655967"},{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E6000",isAssigned:!1,ObjectID:"00163E0E46241ED7A0EA0590D0655967"},{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E8000",isAssigned:!1,ObjectID:"00163E0E46241ED7A0EA0590D0655967"}]; const helper = (emp) => emp.EmployeeID === 'E8000' ? 2 : +(!!emp.isAssigned); const r = items.sort((a, b) => helper(b) - helper(a)); console.log(r);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.