最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

Sorting array after firstName and lastName, javascript - Stack Overflow

matteradmin8PV0评论

Currently I am sorting an array on firstName.

currentUsers = currentUsers.sort(function(a, b) {
    if (a.firstName > b.firstName) {
        return 1;
    } else if (a.firstName < b.firstName) {
        return -1;
    }
};

But I would like to have the lastName sorted as well. So that Bob Anderson would be sorted above Bob Bobson. I looked at another question here on stackoverflow which suggested that I should add:

currentUsers = currentUsers.sort(function(a, b) {
    if (a.firstName > b.firstName) {
        return 1;
    } else if (a.firstName < b.firstName) {
        return -1;
    }

    if (a.lastName > b.lastName) {
        return 1;
    } else if (a.lastName < b.lastName) {
        return -1;
    } else {
        return 0;
    }
};

//Edit The problem I have is that the sorting keeps sorting on every letter in firstName. How would I only sort on the first letter of firstName and then move on to the lastName?

Currently I am sorting an array on firstName.

currentUsers = currentUsers.sort(function(a, b) {
    if (a.firstName > b.firstName) {
        return 1;
    } else if (a.firstName < b.firstName) {
        return -1;
    }
};

But I would like to have the lastName sorted as well. So that Bob Anderson would be sorted above Bob Bobson. I looked at another question here on stackoverflow which suggested that I should add:

currentUsers = currentUsers.sort(function(a, b) {
    if (a.firstName > b.firstName) {
        return 1;
    } else if (a.firstName < b.firstName) {
        return -1;
    }

    if (a.lastName > b.lastName) {
        return 1;
    } else if (a.lastName < b.lastName) {
        return -1;
    } else {
        return 0;
    }
};

//Edit The problem I have is that the sorting keeps sorting on every letter in firstName. How would I only sort on the first letter of firstName and then move on to the lastName?

Share Improve this question edited Mar 24, 2021 at 7:19 Reality-Torrent asked Oct 9, 2015 at 6:36 Reality-TorrentReality-Torrent 3583 silver badges15 bronze badges 4
  • 1 Your first condition always fires return 1 or return -1 if firstName isnt equal. – Joakim M Commented Oct 9, 2015 at 6:38
  • 1 jsfiddle/arunpjohny/awao21ug/1 ? – Arun P Johny Commented Oct 9, 2015 at 6:40
  • I don't see what the problem is... – Hayley Guillou Commented Oct 9, 2015 at 6:41
  • 1 Just concatenate them if ( a.firstName+a.lastName > b.firstName+b.lastName ) – Shanimal Commented Oct 9, 2015 at 6:42
Add a ment  | 

5 Answers 5

Reset to default 7

You can try this ES6 version

const currentUsers = [{
  firstName: "Bob",
  lastName: "Adler"
}, {
  firstName: "Barney",
  lastName: "Jones"
}, {
  firstName: "Freddie",
  lastName: "Crougar"
}, {
  firstName: "Bob",
  lastName: "Adams"
}, {
  firstName: "Joe",
  lastName: "Lewis"
}, {
  firstName: "Joseph",
  lastName: "Lewis"
}];

const sortedUsers = currentUsers.sort((a, b) => {
          const result = a.firstName.localeCompare(b.firstName);

          return result !== 0 ? result : a.lastName.localeCompare(b.lastName);
        })

console.log(sortedUsers);

Just concatenate them with an underscore

var currentUsers = [{
  firstName: "Bob",
  lastName: "Adams"
}, {
  firstName: "Barney",
  lastName: "Jones"
}, {
  firstName: "Freddie",
  lastName: "Crougar"
}, {
  firstName: "Bobby",
  lastName: "Anderson"
}, {
  firstName: "Joe",
  lastName: "Lewis"
}, {
  firstName: "Joseph",
  lastName: "Lewis"
}];

currentUsers = currentUsers.sort(sortOnFirstAndLast)

function sortOnFirstAndLast(a,b) {
  var aa = a.firstName + ", " + a.lastName,
    bb = b.firstName + ", " + b.lastName;
  if (aa > bb)
    return 1;
  else if (aa < bb)
    return -1;
  return 0;
}

var $r = $("#result");
for (var i in currentUsers) {
  var div = $("<div/>").html(i + ":" + currentUsers[i].firstName + ":" + currentUsers[i].lastName);
  $r.append(div)
}
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

Try this;

var currentUsers = [ {
  firstName: "Bob",
  lastName: "Bobson"
},{
  firstName: "Bob",
  lastName: "Anderson"
}, {
  firstName: "Amy",
  lastName: "Jackson"
}];

var sorted = currentUsers.sort(function(a, b) {
  var aFirstChar = a.firstName.charAt(0);
  var bFirstChar = b.firstName.charAt(0);
  if (aFirstChar > bFirstChar) {
    return 1;
  } else if (aFirstChar < bFirstChar) {
    return -1;
  } else {
    var aLastChar = a.lastName.charAt(0);
    var bLastChar = b.lastName.charAt(0);
    if (aLastChar > bLastChar) {
      return 1;
    } else if (aLastChar < bLastChar) {
      return -1;
    } else {
      return 0;
    }    
  }
});

alert(JSON.stringify(sorted));

Just for the sake of alternatives. If you're only paring the first char, you could use charCodeAt instead of charAt to get a numeric value for another way of paring:

currentUsers  = currentUsers.sort(function(a, b) {
    return a.firstName.charCodeAt(0) - b.firstName.charCodeAt(0) 
        || a.lastName.charCodeAt(0) - b.lastName.charCodeAt(0);
});

The || executes only if the firstname first chars are equal (diff = 0)

The best, shortest and most readable code I could figure out was

currentUsers = currentUsers.sort((a, b) =>
    a.firstName.localeCompare(b.firstName) ||
    a.lastName.localeCompare(b.lastName)
);

'||' allows the other parison only execute when first localeCompare returns 0, aka. both names being equal value.

Articles related to this article

Post a comment

comment list (0)

  1. No comments so far