boredbear153
boredbear153

Reputation: 241

Sorting alphabetical order always push ALL text as the first option

I have been trying to sort the below array by string and it is working fine. But the catch is that, the text "ALL", should always appear at the top of the list. Since it is sorted alphabetically, the text "ALL" is moved to its natural alphabetic position.The requirement is after sorting, its should be in the first element in list. how to do this the best way ?

 <div ng-controller="MyCtrl">
     <ul ng-repeat="strVal in arrVal|orderBy:'toString()'" >
        <li>{{strVal}}</li>
    </ul>
 </div>

var app=angular.module('myApp', []);
app.controller('MyCtrl', function ($scope,$filter) {
    $scope.arrVal = ['All','Alabama','Alaska','American Samoa','Arizona','Arkansas','California','Colorado','Connecticut','Delaware','District of Columbia','Federated States of Micronesia','Florida','Georgia','Guam','Hawaii','Idaho','Illinois','Indiana','Iowa','Kansas','Kentucky','Louisiana','Maine','Marshall Islands','Maryland','Massachusetts','Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada','New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Northern Mariana Islands','Ohio','Oklahoma','Oregon','Palau','Pennsylvania','Puerto Rico','Rhode Island','South Carolina','South Dakota','Tennessee','Texas','Utah','Vermont','Virgin Island','Virginia','Washington','West Virginia','Wisconsin','Wyoming']

});

Upvotes: 3

Views: 270

Answers (2)

Trung Duong
Trung Duong

Reputation: 3475

You could try to update your code like this

 <div ng-controller="MyCtrl">
     <ul>
        <li>All</li>
        <li ng-repeat="strVal in arrVal|orderBy:'toString()'">{{strVal}}</li>
    </ul>
 </div>

var app=angular.module('myApp', []);
app.controller('MyCtrl', function ($scope,$filter) {
    $scope.arrVal = ['Alabama','Alaska','American Samoa','Arizona','Arkansas','California','Colorado','Connecticut','Delaware','District of Columbia','Federated States of Micronesia','Florida','Georgia','Guam','Hawaii','Idaho','Illinois','Indiana','Iowa','Kansas','Kentucky','Louisiana','Maine','Marshall Islands','Maryland','Massachusetts','Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada','New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Northern Mariana Islands','Ohio','Oklahoma','Oregon','Palau','Pennsylvania','Puerto Rico','Rhode Island','South Carolina','South Dakota','Tennessee','Texas','Utah','Vermont','Virgin Island','Virginia','Washington','West Virginia','Wisconsin','Wyoming']

});

Upvotes: 0

cнŝdk
cнŝdk

Reputation: 32145

It's quite simple, you just need to add an extra condition in the .sort() callback to give priorities to All string so it shouls always be treated first.

arr.sort(function(a, b) {
  var nameA = a.toUpperCase();
  var nameB = b.toUpperCase();
  if (nameA === "ALL") {
    return -1;
  } else if (nameB === "ALL") {
    return 1;
  }
//The rest of the code

Demo:

This is a Demo:

var arr = ['All', 'Alabama', 'Alaska', 'American Samoa', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'District of Columbia', 'Federated States of Micronesia', 'Florida', 'Georgia', 'Guam', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Marshall Islands', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Northern Mariana Islands', 'Ohio', 'Oklahoma', 'Oregon', 'Palau', 'Pennsylvania', 'Puerto Rico', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virgin Island', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'];


var results = arr.sort(function(a, b) {
  var nameA = a.toUpperCase();
  var nameB = b.toUpperCase();
  if (nameA === "ALL") {
    return -1;
  } else if (nameB === "ALL") {
    return 1;
  } else {
    if (nameA < nameB) {
      return -1;
    }
    if (nameA > nameB) {
      return 1;
    }
  }

  // names must be equal
  return 0;
});
console.log(results);

Upvotes: 3

Related Questions