3
votes

Tri d'objets AngularJs

J'ai JSON comme celui-ci dans l'objet Array principal

[
  {
    "id": "25",
    "section": "1",
    "sectionRange": [
      {
        "sectionNumber": 1,
        "effectAllowed": "all",
        "Date": "",
        "items": [
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 283,
            "actualWeightage": 3.42,
            "totalPaperMarks": 132,
            "title": "10-Creation & Registration of Charges",
            "$$hashKey": "object:146"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 284,
            "actualWeightage": 2.23,
            "totalPaperMarks": 132,
            "title": "11-Allotment of Securities & Issue of Certificates",
            "$$hashKey": "object:147"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 285,
            "actualWeightage": 1.37,
            "totalPaperMarks": 132,
            "title": "12-Membership in a Company",
            "$$hashKey": "object:148"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 286,
            "actualWeightage": 3.42,
            "totalPaperMarks": 132,
            "title": "13-Transfer & Transmission of Securities",
            "$$hashKey": "object:149"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 287,
            "actualWeightage": 7.53,
            "totalPaperMarks": 132,
            "title": "14-Institution of Directors",
            "$$hashKey": "object:150"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 288,
            "actualWeightage": 1.37,
            "totalPaperMarks": 132,
            "title": "15-Independent Directors",
            "$$hashKey": "object:151"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 289,
            "actualWeightage": 13.35,
            "totalPaperMarks": 132,
            "title": "16-Board & its Powers",
            "$$hashKey": "object:152"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 290,
            "actualWeightage": 8.22,
            "totalPaperMarks": 132,
            "title": "17-Appointment & Remuneration of Key Managerial Personnel",
            "$$hashKey": "object:153"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 291,
            "actualWeightage": 6.68,
            "totalPaperMarks": 132,
            "title": "18-General Meetings",
            "$$hashKey": "object:154"
          },
          {
            "subjectId": 25,
            "section": 1,
            "chapterId": 292,
            "actualWeightage": 1.37,
            "totalPaperMarks": 132,
            "title": "19-Loans & Investments by Companies",
            "$$hashKey": "object:155"
          }

Je veux trier l'objet ci-dessus comme

alert(thisObj.scheduleSubject[0].sectionRange[0].items[0].title);

ce que j'ai essayé jusqu'à présent

$scope.checkWeightage=function(){
            thisObj.scheduleSubject.map(itm=>itm.sectionRange.map(subItm=>{
                    var min = subItm.chapterActualWeightage-(subItm.chapterActualWeightage/10);
                    var max = subItm.chapterActualWeightage+(subItm.chapterActualWeightage/10);
                    var sum = subItm.items.reduce((total,it)=>{
                       return total+it.actualWeightage;
                    },0);
                    subItm['weightageError'] = (sum>max || sum<min)?true:false;
                    subItm['ChapterActualWeightageCurrently'] = parseFloat(Math.round(sum*100)/100);
                    subItm.items.sort((a,b)=>a.title.split(/_(.+)/)[0]>b.title.split(/_(.+)/)[0]);
                })
            ); console.log(thisObj.scheduleSubject[0].chapterData); //.1[0].title);
            //console.log("CHECK weightage",thisObj.scheduleSubject);
        }

Comment suivre le titre sur mon tableau principal

obj = [{{"title":"1-Introduction"},
       {"title":"4-Introduction"},
       {"title":"5-Introduction"},
       {"title":"20-Introduction"} }]

Je veux trier tous les éléments sur le base de ses chiffres de titre avant - exemple de caractère 1, 2, 3, 4, 5, 6, 21, 56 et ainsi de suite.

Structure du tableau principal

obj = [{{"title":"1-Introduction"},
       {"title":"5-Introduction"},
       {"title":"20-Introduction"},
       {"title":"4-Introduction"} }]


0 commentaires

3 Réponses :


2
votes

Vous pouvez fractionner sur ce caractère et trier via celui-ci (en supposant que votre structure de données principale soit nommée structure:

structure.forEach(s => {
    s.sectionRange.forEach(sr => {
        sr.items.sort(function(a, b) {
            let aParts = a.split("-"),
                bParts = b.split("-");

            return +aParts[0] - +bParts[0];
        });
    });
});


1 commentaires

merci pour votre réponse je vais vérifier et vous faire savoir



1
votes

Extrayez simplement ces valeurs numériques et laissez orderBy filter d'angularjs faire le travail à votre place

JS

<div ng-repeat="item in data | orderBy:getNumber:false">{{item.title}}</div>

html

  $scope.getNumber = function(row){
    var value = row.title.split("-")[0];
    return parseInt(value);
  };

orderBy prend également un deuxième paramètre (vrai / faux) pour l'ordre asc / desc

Démo


6 commentaires

pour des raisons de simplicité, je n'ai inclus que les éléments faisant partie de votre objet dans la démo


la réponse ci-dessus a résolu mon problème, mais j'ai également essayé votre méthode et j'obtiens une erreur. Le jeton 'orderBy' est un jeton inattendu à la colonne 17 de l'expression [container.items orderBy: getNumber (item): true] commençant à [orderBy: getNumber (item): true].


vous avez probablement copié quelque chose de mal, veuillez comparer votre code avec l'exemple fourni dans la démo plnkr. Aussi, si vous pouvez créer un plunker, je peux vous aider avec le débogage.


oui, je viens de voir l'exemple et maintenant ça marche aussi.


heureux d'avoir pu aider.


et je pense que cette méthode sera un moyen de tri plus lent par rapport à ce qui précède. ai-je raison?



1
votes

Vous pouvez utiliser un Array.prototype.sort avec une simple fonction sort dans laquelle vous analysez la valeur title de chaque objet du tableau comme un int et comparez . Quelque chose comme ceci:

var arr = [{
    "title": "1-Introduction"
  },
  {
    "title": "5-Introduction"
  },
  {
    "title": "20-Introduction"
  },
  {
    "title": "4-Introduction"
  }
];


arr.sort(function(a, b) {
  const aVal = parseInt(a.title.split("-")[0]);
  const bVal = parseInt(b.title.split("-")[0]);
  return aVal - bVal;
});

console.log(arr);


0 commentaires