javascript: varios datos en una matriz, pero solo se ordenan por nombre


Tengo una matriz actualmente solo con nombres porque no puedo encontrar la manera de agregar más información pero no hacer que el script clasifique esos datos. Para cada entrada en la matriz, deseo agregar un número entre 1 y 20 para cada una, y también contar cuántas se nombran con ese nombre. Entonces sería algo así como 1. Nielsen (100,000). Es solo un problema con mi segunda función porque necesito ordenarla por longitud.

<script>
    var arr = []
    arr[0] = " Nielsen"
    arr[1] = " Jensen"
    arr[2] = " Hansen"
    arr[3] = " Pedersen"
    arr[4] = " Andersen"
    arr[5] = " Christensen"
    arr[6] = " Larsen"
    arr[7] = " Sørensen"
    arr[8] = " Rasmussen"
    arr[9] = " Jørgensen"
    arr[10] = " Petersen"
    arr[11] = " Madsen"
    arr[12] = " Kristensen"
    arr[13] = " Olsen"
    arr[14] = " Thomsen"
    arr[15] = " Christiansen"
    arr[16] = " Poulsen"
    arr[17] = " Johansen"
    arr[18] = " Møller"
    arr[19] = " Mortensen"

    document.getElementById("liste").innerHTML = arr; // Skriver den oprindelige rækkefølge

    function Sorter1() {
        arr.sort(); // Sorter efter aflabetisk rækkefølge
        document.getElementById("liste").innerHTML = arr; // Skriver rækkefølgen
    }

    function Sorter2() {
        arr.sort(function (a, b) {
            return b.length - a.length || // sorter efter længde
                a.localeCompare(b); // Sorter efter aflabetisk rækkefølge
        });
        document.getElementById("liste").innerHTML = arr; // Skriver rækkefølgen
    }
</script>



------------Respuesta------------

Si entiendo que corrige, le gustaría crear una matriz multidimensional y luego ordenarla por nombre alfabéticamente y por número de caracteres. Si eso es correcto, le sugiero que cree un objeto multidimensional con los datos necesarios. Entonces podrá ordenar la clave de nombre y conservar la otra información correctamente.

Mira esto, puede llevarte en la dirección correcta

var arr = [
    {
    name: 'Nielsen',
    num: 1,
    count: 100
  },
  {
    name: 'Jensenlongest',
    num: 15,
    count: 230
  },
  {
    name: 'Jensenlong',
    num: 13,
    count: 500
  },
  {
    name: 'Jensen',
    num: 2,
    count: 300
  },
  {
    name: 'Hansen',
    num: 5,
    count: 400
  }
]

// Just adds the unsorted arr to the list for demo purpose
updateList(arr)

// On "Sort by length" button click
document.getElementById('sort-by-length').addEventListener('click', function (event) {
    arr.sort(sortNameByLength);
  updateList(arr);
})

// On "Sort alphabetically" button click
document.getElementById('sort-alphabetically').addEventListener('click', function (event) {
    arr.sort(sortNameAlphabetically);
  updateList(arr);
})

// Sort by name alphabetically
function sortNameAlphabetically(a, b) {
    return a.name > b.name
}

// Sort by name length
function sortNameByLength(a, b) {
    return a.name.length - b.name.length
}

// Updates the list according to the current sorting of the arr
function updateList(names) {
  var listHtml = ''

  names.forEach(function (item, index) {
    listHtml += item.name + ', ' + item.num + ' (' + item.count + ')<br>'
  })

  document.getElementById("liste").innerHTML = listHtml
}

https://jsfiddle.net/sbe8yzv0/4/

Esto dará como resultado una lista como esta.

Hansen, 5 (400)
Jensen, 2 (300)
Jensenlong, 13 (500)
Jensenlongest, 15 (230)
Nielsen, 1 (100)


------------Respuesta------------

Puede usar una matriz de objetos complejos con la estructura de datos que desee (solo sea coherente). Luego defina su propio método sort() que comparará solo el parámetro de nombre de sus objetos. He aquí un ejemplo sencillo:

var arr = [];
arr[0] = {ID: 1, Name: "Nielsen", Value: "100"};
arr[0] = {ID: 2, Name: "Jensen", Value: "200"};
// Sort based on the second column, 'Name'.
function sortByName(){
    arr.sort(
        function(x, y){
            return x.Name > y.Name; // Compare and sort based on the 'Name' column only.
        }
    );
    console.log(arr[0]);    // If results are correct this is 'Jensen'.
    console.log(arr[1]);    // If results are correct this is 'Nielsen'.
}   

Adapte esto a sus necesidades (agregue las columnas y los datos apropiados, agregue las variables apropiadas, hágalo para que se muestre en el HTML de su página) y hará lo que quiera.

Etiquetas: sorting list arrays javascript

Artículos relacionados:

redes: ¿por qué 802.1Q no encapsula el marco original?

javascript - Uso de JSONAPI con servicio