1
votes

Lodash - Déplacer l'objet à la première place dans le tableau que trier par une autre propriété

J'ai un tableau d'employés d'objets

 entrez la description de l'image ici

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?


8 commentaires

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


3 Réponses :


3
votes

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...
})


4 commentaires

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 :)



2
votes

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);


1 commentaires

Exactement ce que je voulais danke schon :)



0
votes

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);


3 commentaires

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