4

do you know if there is a way to sort an array of objects using the sort() method for a specific property? In my case I'd like to sort my array first for "bananas", then for "pears", and then the rest.

const initialData = [
{ name: "strawberries", value: 12 },
{ name: "bananas", value: 3 },
{ name: "pears", value: 8 },
{ name: "pears", value: 7 },
{ name: "bananas", value: 10 },
{ name: "apples", value: 6 },
{ name: "bananas", value: 13 },
{ name: "bananas", value: 5 }
]

This is how I'd like the sorted data to look like:

const sortedData = [
{ name: "bananas", value: 3 },
{ name: "bananas", value: 10 },
{ name: "bananas", value: 13 },
{ name: "bananas", value: 5 },
{ name: "pears", value: 8 },
{ name: "pears", value: 7 },
{ name: "strawberries", value: 12 },
{ name: "apples", value: 6 }
]

I know that this function would sort my data ascending or descending:

initialData.sort(function(a, b) {
  if (a.name < b.name) {
    return -1;
  }
  if (a.name > b.name) {
    return 1;
  }
  return 0;
});
2

5 Answers 5

7

You could take an object with the wanted order and take a large value as default for sorting.

const
    data = [{ name: "strawberries", value: 12 }, { name: "bananas", value: 3 }, { name: "pears", value: 8 }, { name: "pears", value: 7 }, { name: "bananas", value: 10 }, { name: "apples", value: 6 }, { name: "bananas", value: 13 }, { name: "bananas", value: 5 }],
    order = { bananas: 1, pears: 2 };

data.sort((a, b) => (order[a.name] || Number.MAX_VALUE) - (order[b.name] || Number.MAX_VALUE));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

Comments

3

you can use an auxiliary array to define the sorting scheme. Here is an example:

const sortingScheme = [
  "bananas",
  "pears",
  "strawberries",
  "apples"
]

initialData.sort((a, b) => {
  const indexOfa = sortingScheme.indexOf(a.name);
  const indexOfb = sortingScheme.indexOf(b.name);
  if (indexOfa > indexOfb)
    return 1
  if (indexOfa < indexOfb)
    return -1
  return 0;
})

This only works if you know all the names the array can hold. If you are interested in ordering only a few fields you can do this:

const orderedScheme = [
  "bananas",
  "pears"
]

initialData.sort((a, b) => {
  let indexOfa = orderedScheme.indexOf(a.name);
  let indexOfb = orderedScheme.indexOf(b.name);

  if (indexOfa < 0) indexOfa = orderedScheme.length;
  if (indexOfb < 0) indexOfb = orderedScheme.length;

  if (indexOfa > indexOfb)
    return 1
  if (indexOfa < indexOfb)
    return -1
  return 0;
})

This is because if the element is not contained in the 'sortingScheme' array, the indexOf() function returns -1 which would place the element at the beginning of the array.

I hope I have been useful to you!

Comments

0

You Can Use This For Custom Sorting:

initialData.sort(function(a, b) {
  var customSort="bpsacdefghijklmnoqrtuvwxyz";
  var aa=customSort.indexOf(a.substr(0,1));
  var bb=customSort.indexOf(b.substr(0,1));
  if (aa < bb) {
    return -1;
  }else if (aa > bb) {
    return 1;
  }else
    return 0;
});

Sorting Performs According to This Characters:

var customSort="bpsacdefghijklmnoqrtuvwxyz";

Comments

0

sort method, check for names. when names are equal order by value. When names not equal then order by names. (check inline comments)

const initialData = [
  { name: "strawberries", value: 12 },
  { name: "bananas", value: 3 },
  { name: "pears", value: 8 },
  { name: "pears", value: 7 },
  { name: "bananas", value: 10 },
  { name: "apples", value: 6 },
  { name: "bananas", value: 13 },
  { name: "bananas", value: 5 },
];

initialData.sort((a, b) => {
  const order = ["pears", "bananas"]; // high priority items towards end.
  if (a.name === b.name && order.includes(a.name)) {
    return a.value - b.value;
  } else {
    // when item not in order, indexOf will return -1. 
    // Basically comparing the values -1, 0, 1
    return order.indexOf(b.name) - order.indexOf(a.name);
  }
});

console.log(initialData);

Comments

-1

you can to this

const initialData = [
    { name: "strawberries", value: 12 },
    { name: "bananas", value: 3 },
    { name: "pears", value: 8 },
    { name: "pears", value: 7 },
    { name: "bananas", value: 10 },
    { name: "apples", value: 6 },
    { name: "bananas", value: 13 },
    { name: "bananas", value: 5 }
    ]

    const data = initialData.sort(function(a, b) {
        if (a.name < b.name) {
            if(a.name === "apples") {
                return 1
            }
          return -1;
        }
        return 0;
      });
      console.log(data)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.