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
}
]