-1

I currently have an array of objects that looks something like this:

let array = [
    { name: "Apple", number: "1" },
    { name: "John", number: "2" },
    { name: "Car", number: "1" },
    { name: "Tiger", number: "1" },
    { name: "Jeep", number: "2" },
    { name: "Bee", number: "1" },
    { name: "Zoo", number: "2" },
    { name: "Cow", number: "9" },
    { name: "Pet", number: "6" },
]

Right now I sort this array using the number property which results in something like this:

let array = [
    { name: "Apple", number: "1" },
    { name: "Car", number: "1" },
    { name: "Tiger", number: "1" },
    { name: "Bee", number: "1" },
    { name: "Zebra", number: "2" },
    { name: "Jeep", number: "2" },
    { name: "Quake", number: "2" },
    { name: "Pet", number: "6" },
    { name: "Cow", number: "9" }, 
]

This is done by using this function

    sortedByNumber(array){
        return array.sort((a, b) => a.number - b.number)
    },

I am wondering if it's possible to also sort the array using the name property so that the elements are in alphabetical order while keeping the number ordering as well. The result should look like this:

let array = [
    { name: "Apple", number: "1" },
    { name: "Bee", number: "1" },
    { name: "Car", number: "1" },
    { name: "Tiger", number: "1" },
    { name: "Jeep", number: "2" },
    { name: "Quake", number: "2" },
    { name: "Zebra", number: "2" },
    { name: "Pet", number: "6" },
    { name: "Cow", number: "9" },
]
Onyx
  • 5,186
  • 8
  • 39
  • 86

2 Answers2

1

i think this is what you want

console.log(array.sort((a, b) => {
    if (a.number > b.number) return 1;
    if (a.number < b.number) return -1;

    if (a.name > b.name) return 1;
    if (a.name < b.name) return -1;
}))

the result will be like this

[
  {
    "name": "Apple",
    "number": "1"
  },
  {
    "name": "Bee",
    "number": "1"
  },
  {
    "name": "Car",
    "number": "1"
  },
  {
    "name": "Tiger",
    "number": "1"
  },
  {
    "name": "Jeep",
    "number": "2"
  },
  {
    "name": "John",
    "number": "2"
  },
  {
    "name": "Zoo",
    "number": "2"
  },
  {
    "name": "Pet",
    "number": "6"
  },
  {
    "name": "Cow",
    "number": "9"
  }
]
Joseph
  • 5,644
  • 3
  • 18
  • 44
1

let array = [
  { name: "Apple", number: "1" },
  { name: "John", number: "2" },
  { name: "Car", number: "1" },
  { name: "Tiger", number: "1" },
  { name: "Jeep", number: "2" },
  { name: "Bee", number: "1" },
  { name: "Zoo", number: "2" },
  { name: "Cow", number: "9" },
  { name: "Pet", number: "6" }
];

const strCompare = (a, b) => {
  if (b > a) {
    return -1;
  }
  if (a > b) {
    return 1;
  }
  return 0;
};

const compare = (a, b) => {
  if (a.number === b.number) {
    return strCompare(a.name, b.name);
  }
  return Number(a.number) - Number(b.number);
};

array.sort(compare);

console.log(array)
Siva K V
  • 10,561
  • 2
  • 16
  • 29