Placing in alphabetical order an array of objects [duplicate]

0

I have an array of objects and I want to put them in alphabetical order but I'm not getting through the javascript, I'll put how the array is structured and the code to call the page

var json = [
  {
        "ID":"1",
        "TÍTULO":"Algum titulo",
        "AUTORES":[
              {
                    "AUTOR":"Fulano",
                    "INSTITUIÇÃO":""
              },
              {
                    "AUTOR":"Cicrano",
                    "INSTITUIÇÃO":"instituição"
              },
              {
                    "AUTOR":"Nomes",
                    "INSTITUIÇÃO":"Nomes"
              }
        ]
  },
  {
        "ID":"2",
        "TÍTULO":"Algum titulo 2",
        "AUTORES":[
              {
                    "AUTOR":"algum nome",
                    "INSTITUIÇÃO":"Nomes"
              },
              {
                    "AUTOR":"Nomes",
                    "INSTITUIÇÃO":"Nomes"
              }
        ]
  }
];

var filter = json.filter(x => x.AUTORES.some(autor => autor.AUTOR));    
    for(var i=0;i<filter.length; i++){
        for(var j=0;j<filter[i].AUTORES.length; j++){
            var html = '<tr bgcolor="#F5F5F5">';
            html +='<td width="13%">' +filter[i].AUTORES[j].AUTOR+'</td>';
            html +='</tr>';
            $('table tbody').append(html);
        }
    }
    
asked by anonymous 25.10.2018 / 18:42

1 answer

0

The callback passed in sort receives two arguments, which are the two items that you must compare, and then return a number greater than 0 to say that the first element is larger, or vice versa.

In your case, to sort by title would be:

var ordenados = json.sort((livroA, livroB) => livroA['TÍTULO'] > livroB['TÍTULO'] ? 1 : -1);

To organize by author you would have to organize the authors name too, not an efficient code, but this works:

var ordenados = json.sort((livroA, livroB) => 
    livroA.AUTORES.map(a => a.AUTOR).sort().join(' ') > 
    livroB.AUTORES.map(a => a.AUTOR).sort().join(' ') ? 1 : -1);

And if you need to ignore the uppercase:

var ordenados = json.sort((livroA, livroB) => 
    livroA.AUTORES.map(a => a.AUTOR.toLowerCase()).sort().join(' ') > 
    livroB.AUTORES.map(a => a.AUTOR.toLowerCase()).sort().join(' ') ? 1 : -1);
    
25.10.2018 / 19:13