J'ai un tableau d'employés d'objets
var sortedItems = _.sortBy(items, function(item) { return (item.isAssigned === true || item.EmployeeID === "E8000") ? 0 : 1; });
Je voudrais mettre l'employé où EmployeeID
est égal à E8000
first in list, than I want the employee where isAssigned
is égal à true
à suivre
Jusqu'à présent, j'ai réalisé ceci:
{ "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" } }
Mais comment s'assurer que l'emp avec EmployeeID
est égal à E8000
pour être toujours au top?
3 Réponses :
Je ne sais pas pourquoi vous avez besoin de lodash à ce sujet:
if(a.BusinessPartnerFormattedName < b.BusinessPartnerFormattedName) return -1; if(a.BusinessPartnerFormattedName > b.BusinessPartnerFormattedName) return 1; return 0;
Cela se traduit par:
"Au moment de décider si a
ou b
doit venir en premier, si a
et b
n'ont pas tous les deux la même valeur EmployeeID, vérifiez si l'un ou l'autre a la valeur E8000
. Si l'éther a cette valeur, mettez-la en premier.
Sinon, vérifiez si a
et b
ont la même valeur pour isAssigned
, s'ils ne le font pas, mettez d'abord celui qui a true
comme valeur isAssigned
.
Enfin si les conditions précédentes n'ont pas été satisfaites, suivez la logique que vous voulez pour définir ce qui devrait commencer.
Bien sûr, vous devez remplir la logique de tri que vous voulez suivre. Par exemple, si vous voulez trier par ordre alphabétique sur BusinessPartnerFormattedName
, vous remplissez ce bloc Logique de tri restante ...
avec:
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... })
J'adore le lodash, le choix personnel mais merci pour votre approche vanille
Cela n'a aucun sens ... OP a un tableau d'objets qui ont un objet imbriqué à l'intérieur ... Votre solution ne le résoudra pas
@ kinduser- Vous avez raison! Désolé, je pensais que l'objet de niveau supérieur était un tableau. napi15, cela ne fonctionnera PAS si votre objet de niveau supérieur n'est pas un tableau.
@DRich On dirait que cela correspond au problème OP :)
Vous enchaînez l'ordre de tri souhaité.
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
.as-console-wrapper { max-height: 100% !important; top: 0; }
Avec 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; }
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);
Exactement ce que je voulais danke schon :)
Les données que vous avez fournies sont très trompeuses, mais j'aimerais toujours publier ma solution, car je l'aime simplement.
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);
Merci pour votre réponse, mais je voudrais améliorer ma question, pourriez-vous me dire ce qui est trompeur afin que je puisse la modifier?
@ napi15 Donc, fondamentalement, vous avez publié un tableau d'objets, mais à l'intérieur de ces objets se trouve un objet imbriqué avec la clé "emp1", "emp2" et ainsi de suite, et la valeur de ces clés est l'objet employé. Donc, c'est comme une structure imbriquée, mais toutes les réponses publiées sont liées à un tableau plat d'objets (sans ces clés "emp1", "emp2"), juste un tableau d'objets employés
Oh ok, oui j'ai remarqué que toutes les réponses fournies ne correspondent pas à ma structure imbriquée, mais j'adapte la logique fournie et merci encore pour votre réponse
auriez-vous plus de trois articles? que devrait-il se passer si plus?
btw, vous essayez de trier un objet, car le tableau n'a qu'un seul élément ...
@NinaScholz Oui, j'ai 99 éléments, mais mon code est un exemple simple
Mais comme Nina l'a dit, vous ne pouvez pas trier un objet. Vouliez-vous dire un tableau d'objets? (sans ces clés
emp1
,emp2
et ainsi de suite)?@kinduser Oui tableau d'objets, j'ai fait une correction (je suis désolé pour la confusion causée)
@NinaScholz C'est un tableau d'objets emp, désolé pour la confusion causée, j'ai édité et ajouté des corrections
avez-vous
'E8000'
avec faux?@NinaScholz Non, cet emp spécifique est toujours vrai