Mam grę wieloosobową, a dane dotyczące rozgrywki są przechowywane w ten sposób:

var gameplays = [
    {id: "1", player1: "bob", player2: "tim", score1: 2, score2: 14},
    {id: "2", player1: "bob", player2: "tim", score1: 7, score2: 3},
    {id: "3", player1: "bob", player2: "tim", score1: 6, score2: 10},
    {id: "4", player1: "bob", player2: "tim", score1: 5, score2: 1}
];

Jaki jest najskuteczniejszy sposób na znalezienie 5 najlepszych wysokich wejść ze wszystkich gier, szukając "wynik" i "wynik2" i wyślij je w ten sposób:

HIGHSCORES
1. Tim - 14
2. Tim - 10
3. Bob - 7
4. Bob - 6
5. Bob - 5
0
supercoolville 25 czerwiec 2017, 07:03

4 odpowiedzi

Najlepsza odpowiedź
var scores = [];
for (var i = 0; i < gameplays.length; i++) {
    scores.push({score: gameplays[i].score1, name: gameplays[i].player1});
    scores.push({score: gameplays[i].score2, name: gameplays[i].player2});
}

scores.sort(function (a, b) {
    return b.score - a.score;
});

scores.splice(0, 5);

Najpierw zdobądź wyniki i spłaszcz je w tablicy wyników wraz z wynikiem i nazwą osoby.

Następnie sortujamy tablicę i splicing otrzyma najlepsze wyniki z nazwą.

3
gauravmuk 25 czerwiec 2017, 04:21

Jeśli zamaznisz do benchmarku, byłbym zainteresowany wydajnością "funkcjonalnego" rozwiązania z ramką.

var gameplays = [
    {id: "1", player1: "bob", player2: "tim", score1: 2, score2: 14},
    {id: "2", player1: "bob", player2: "tim", score1: 7, score2: 3},
    {id: "3", player1: "bob", player2: "tim", score1: 6, score2: 10},
    {id: "4", player1: "bob", player2: "tim", score1: 5, score2: 1}
];

// find the 5 top highscores regardless which player
const normalizeScore = ({id, player1, score1, player2, score2}) => 
    [{id, player1, score: score1}, {id, player2, score: score2}];
const sortByScore = (play1, play2) => play2.score - play1.score;

const normalizeGameplays = R.chain(normalizeScore); // chain === flatMap
const sortGameplays = R.sort(sortByScore);
const topFive = R.slice(0, 5);

const highscore = R.compose(topFive, sortGameplays, normalizeGameplays);

console.log(highscore(gameplays));

@See: https://jsbin.com/wixowa/edit?htmljs olidole.

0
ChrisY 25 czerwiec 2017, 09:46

Możesz to zrobić w pewnym miejscu, myślę, że z:

gameplays.sort(function(_a, _b){
    var a = _a.score1 > _a.score2 ? _a.score1 : _a.score2;
    var b = _b.score1 > _b.score2 ? _b.score1 : _b.score2;

    if(a < b) {
      return 1;
    }

    if(a > b) {
      return -1;
    }

    return 0;
})

Następnie możesz uzyskać dostęp do pierwszej piątki z:

gameplays.slice(0, 5)
0
Joe Lissner 25 czerwiec 2017, 05:02
const gameplays = [
    {id: "1", player1: "bob", player2: "tim", score1: 2, score2: 14},
    {id: "2", player1: "bob", player2: "tim", score1: 7, score2: 3},
    {id: "3", player1: "bob", player2: "tim", score1: 6, score2: 10},
    {id: "4", player1: "bob", player2: "tim", score1: 5, score2: 1}
];

Najpierw napisz wszystkie istotne informacje o grze w tablicę obiektów, z których każdy zawiera klucz gracza odpowiadający nazwę gracza i klucz wynikowy, który odpowiada wynikowi:

const results = [];

gameplays.forEach(game => {
  for(let i = 1; i <= 2; i++) {
    results.push({});
    results[results.length - 1].player = `${game[`player${i}`].slice(0, 1).toUpperCase()}${game[`player${i}`].slice(1).toLowerCase()}`;
    results[results.length - 1].score = game[`score${i}`];
  }
});

Następnie sortuj tablicę w kolejności saldingu wyników, zanim dotrzymy się tylko 5 najlepszych z plasterkiem.

const topFive = results.sort((result1, result2) => result2.score - result1.score)
                       .slice(0, 5);

Wreszcie wyświetlić 5 najlepszych punktów.

console.log('High Scores');

for(let i = 0; i < topFive.length; i++) {
  console.log(`${i + 1}. ${topFive[i].player} - ${topFive[i].score}`);
}
1
elqueso101 25 czerwiec 2017, 06:05