En C #, creo una estructura y uso LINQ para ordenar MyList.

public struct MyContainer
{
  public string Name;
  public string Firstname;
  public int Firstscore;
  public int Secondscore;

  public MyContainer(string name, string firstname, int firstscore, int secondscore)
  {
    Name = name;
    Firstname = firstname;
    Firstscore = firstscore;
    Secondscore = secondscore;
  }
}

public List<MyContainer> SortedList = new List<MyContainer>();
public List<MyContainer> MyList = new List<MyContainer>();

MyList.Add(new MyContainer("Kramer","Sandy",300,50);
MyList.Add(new MyContainer("Connor","Tom",450,30);
MyList.Add(new MyContainer("Black","Ron",200,55);
MyList.Add(new MyContainer("Diaz","Kate",300,40);
MyList.Add(new MyContainer("Sandler","Jessica",450,25);

SortedList = MyList.OrderBy(user => user.Firstscore).ThenBy(user => user.Secondscore).ToList();

Quiero ordenar MyList primero por FirstScore y luego por Secondscore. SortedList debería verse así después de ordenar MyList:

("Black","Ron",200,55)
("Diaz","Kate",300,40)
("Kramer","Sandy",300,50)
("Sandler","Jessica",450,25)
("Connor","Tom",450,30)

En C #, funciona así, pero no sé cómo hacerlo en JavaScript. ¿Cómo puedo hacer lo mismo en JavaScript? ¿Cómo puedo crear una estructura en JavaScript y ordenarla después?

-1
Bill_Johnson77 10 jul. 2021 a las 16:37

3 respuestas

La mejor respuesta

Puede crear una clase con getter y setter y luego ordenarla con la función de ordenación personalizada

function sortByFirstscoreAfterSecondscore(a, b) {
  return a.Firstscore - b.Firstscore || a.Secondscore - b.Secondscore;
}
class MyContainer {
  constructor(Name, Firstname, Firstscore, Secondscore) {
    this._Name = Name;
    this._Firstname = Firstname;
    this._Firstscore = Firstscore;
    this._Secondscore = Secondscore;
  }

  get Firstscore() {
    return this._Firstscore;
  }

  set Fristscore(Firstscore) {
    this._Firstscore = Firstscore;
  }

  get Secondscore() {
    return this._Secondscore;
  }

  set Secondscore(Secondscore) {
    this._Secondscore = Secondscore;
  }
}

let list = [];
list.push(new MyContainer("Kramer", "Sandy", 300, 50));
list.push(new MyContainer("Connor", "Tom", 450, 30));
list.push(new MyContainer("Black", "Ron", 200, 55));
list.push(new MyContainer("Diaz", "Kate", 300, 40));
list.push(new MyContainer("Sandler", "Jessica", 450, 25));


function sortByFirstscoreAfterSecondscore(a, b) {
  return a.Firstscore - b.Firstscore || a.Secondscore - b.Secondscore;
}

const result = [...list].sort(sortByFirstscoreAfterSecondscore);
console.log(result);
0
decpk 10 jul. 2021 a las 14:12

Puedes hacerlo así:

const arr = [
    { name:"Sandler", firstname: "Jessica", firstscore: 450, secondscore: 25 },
    { name:"Diaz", firstname: "Kate", firstscore: 300, secondscore: 50 },
    { name:"Black", firstname: "Ron", firstscore: 200, secondscore: 51 },
    { name:"Connor", firstname: "Tom", firstscore: 200, secondscore: 55 },
  ]
  console.log(`arr`, arr);
  
  arr.sort((a,b)=>a.firstscore-b.firstscore || a.secondscore-b.secondscore )
  console.log(`arr`, arr);
0
Konstantin Modin 10 jul. 2021 a las 14:07

Para MyContainer, podrías hacer una clase:

class MyContainer {
  constructor(name, firstname, firstscore, secondscore) {
    this.name = name;
    this.firstname = firstname;
    this.firstscore = firstscore;
    this.secondscore = secondscore;
  }
}

const example = new MyContainer('Kramer', 'sandy', 300, 50);

Aunque para algo tan simple como esto, también puede considerar simplemente hacer objetos literales:

const example = { 
  name: 'kramer',
  firstname: 'sandy',
  firstscore: 300,
  secondscore: 50,
}

Luego, los pondrá en una matriz y usará el método .sort de la matriz para ordenarlos. Proporcionas una función para ordenar diciéndole cómo comparar elementos. Devolver un número positivo dice poner el elemento b primero; el número negativo pone a primero; 0 los deja en el mismo orden.

class MyContainer {
  constructor(name, firstname, firstscore, secondscore) {
    this.name = name;
    this.firstname = firstname;
    this.firstscore = firstscore;
    this.secondscore = secondscore;
  }
}

const myList = [
  new MyContainer("Kramer", "Sandy", 300, 50),
  new MyContainer("Connor", "Tom", 450, 30),
  new MyContainer("Black", "Ron", 200, 55),
  new MyContainer("Diaz", "Kate", 300, 40),
  new MyContainer("Sandler", "Jessica", 450, 25),
];

const sortedList = [...myList]; // create a shallow copy
sortedList.sort((a, b) => {
  const firstScoreDiff = a.firstscore - b.firstscore;
  if (firstScoreDiff === 0) {
    return a.secondscore - b.secondscore;
  } else {
    return firstScoreDiff;
  }
});

console.log(sortedList);
0
Nicholas Tower 11 jul. 2021 a las 15:30