Home > Mobile >  Sort an array of objects based on string
Sort an array of objects based on string

Time:08-11

I have an array of objects with two attributes, id and fileName. I want to sort the array based on the numbers of the files. For example I have the array:

let array = [
      {
        fileName: "5.4 Hello world",
        id: 2

      },
      {
        fileName: "1.1 String",
        id: 5

      },
      {
        fileName: "3.2 Sort ",
        id: 1

      },
      {
        fileName: "4. This is a string",
        id: 4
      },

And I want it to be sorted like this:

array = [

      {
        fileName: "1.1 String",
        id: 5

      },
      {
        fileName: "3.2 Sort ",
        id: 1

      },
      {
        fileName: "4. This is a string",
        id: 4
      },
      {
        fileName: "5.4 Hello world",
        id: 2

      },

CodePudding user response:

To support multidigit numbers, you would eventually need something like "natural" sort, and that in combination with fetching the fileName from each object:

const collator = new Intl.Collator(undefined, 
                                  {numeric: true, sensitivity: 'base'});
const natSort = array => 
    array.sort((a, b) => collator.compare(a.fileName, b.fileName));


// Example use
const array = [{fileName: "5.4 Hello world", id: 2},{fileName: "1.1 String",id: 5},{fileName: "3.2 Sort ",id: 1},{fileName: "4. This is a string",id: 4},];

const result = natSort(array);
console.log(result);

CodePudding user response:

You can sort a list like this with the sort-Function, split the name and parse the first number as float:

const list = [
      {
        fileName: "5.4 Hello world",
        id: 2

      },
      {
        fileName: "1.1 String",
        id: 5

      },
      {
        fileName: "3.2 Sort ",
        id: 1

      },
      {
        fileName: "4. This is a string",
        id: 4
      },
]

list.sort((a, b) => {
  const aIdx = parseFloat(a.fileName.split(" ")[0])
  const bIdx = parseFloat(b.fileName.split(" ")[0])

  return (aIdx > bIdx) ? 1 : -1
})

console.log(JSON.stringify(list, null, 4))

This will return:

[
    {
        "fileName": "1.1 String",
        "id": 5
    },
    {
        "fileName": "3.2 Sort ",
        "id": 1
    },
    {
        "fileName": "4. This is a string",
        "id": 4
    },
    {
        "fileName": "5.4 Hello world",
        "id": 2
    }
]
  • Related