поскольку я возвращаю array с 5 самыми повторенными элементами

У меня есть класс Playlist с одним array объектов Song, я пробую создавать метод, который возвращал бы мне только песни 5 артистов с большим количеством песен, но не встречаю клавиши (только я провожу один месяц программируя) кто-то мне мог бы давать какой-то отпечаток?

Я попробовал упорядочивать их с sort и потом использовать slice., но не, как делание для однажды упорядоченная артистами, оставаться одиноким песни, которые принадлежат 5 артистам с большим количеством песен...

Я пробую с sort но так единственная дойка array из-за группы, но не, как "отрезание" для того, чтобы Вы только у меня остались они 5 первых, я помещаю вас немного кодекса:

function Playlist(name){
    this.name = name;
    this.songs = new Array();
    this.shuffled = false;
    }
function Song(title, artist, duration, score){
    this.title = title;
    this.artist = artist;
    this.duration = duration;
    this.score = score; 
    this.currentSongIndex = 0;

        Playlist.prototype.orderByArtist = function(){
    this.songs.sort(function(a,b){      
        if(a.artist > b.artist){
            return -1;
        }
        else if(a.artist < b.artist){
            return 1;
        }
        else{
            return 0;
        }
    })
    return this.songs;
}   

Playlist.prototype.topArtist = function(){  
    this.songs.orderByArtist();
    for(let i = 0; i < this.songs.length; i++){
            let cont = 0;
            let band = this.songs[i].artist;    
                for(let j = 0, j < this.songs.length; j++)
                    if(band == this.songs[j].artist){
                        cont++;
                    }   
            checker.push(band); 
            }   
        }
}   
0
задан 01.11.2019, 18:46
2 ответа

Шаги, которые должны осуществляться:

  1. , Реализовывать подсчет песен из-за артиста, чтобы это реализовывать, ты можешь основываться используя Array.prototype.reduce () , пробегая каждый canci¦n playlist и в конце концов создавая объект со свойствами {artist, songs}, где в artist мы будем сохранять имя артиста и в songs песни, что ты принадлежишь артисту.

  2. Приказывать артисты según количество песен несовершеннолетнему большего, для этого мы должны пробегать объект, созданный в шаге 1 и упорядочивать артист согласно количеству песен в команде descente, aquà - он, где мы очень полезный Array.prototype.sort () .

  3. Направлять первые 5 артистов, aquà - мы можем основываться Array.prototype.slice () .

В continuaci¦n método traerArtistasPrincipales , браться за то, чтобы реализовывать эти шаги, просто мы посылаем ему playlist и él он берется за оставшуюся часть.

MÃ: s informaci¦n:

function Playlist(name) {
    this.name = name;
    this.songs = new Array();
    this.shuffled = false;
}

function Song(title, artist, duration, score) {
    this.title = title;
    this.artist = artist;
    this.duration = duration;
    this.score = score;
    this.currentSongIndex = 0;
}

// Método para obtener los 5 primeros artistas principales
const traerArtistasPrincipales = (playlist) => {
    let artistas_principales = [];

    if (typeof playlist === 'object') {

        // Creamos objeto donde guardamos el artista y las canciones que tiene
        const cantidad_canciones_artista = playlist.songs.reduce((artistas, cancion) => {
            if (!artistas[cancion.artist]) {
                artistas[cancion.artist] = {
                    artist: cancion.artist,
                    songs: []
                };
            }

            artistas[cancion.artist].songs.push(cancion);

            return artistas;
        }, {})

        // Ordenamos los artistas por número de canciones en orden descendente
        const artistas_ordenados = Object.values(cantidad_canciones_artista)
            .sort((song_a, song_b) => {
                if (song_a.songs.length < song_b.songs.length) {
                    return 1;
                } else if (song_a.songs.length > song_b.songs.length) {
                    return -1;
                } else {
                    return 0;
                }
            });

        // Tomar los 5 primeros
        artistas_principales = artistas_ordenados.slice(0, 5);
    }

    return artistas_principales;
};

// Prueba de ejecución
const playlist_test = new Playlist('Mi lista');

playlist_test.songs = [
    new Song('Canción 1', 'oscar', 1, 1),
    new Song('Canción 2', 'oscar', 1, 1),
    new Song('Canción 3', 'miguel', 1, 1),
    new Song('Canción 4', 'ana', 1, 1),
    new Song('Canción 5', 'oscar', 1, 1),
    new Song('Canción 6', 'ana', 1, 1),
    new Song('Canción 7', 'oscar', 1, 1),
    new Song('Canción 8', 'alex', 1, 1),
    new Song('Canción 9', 'alex', 1, 1),
    new Song('Canción 10', 'pedro', 1, 1),
    new Song('Canción 11', 'juan', 1, 1),
];

console.log({
    artistas_principales: traerArtistasPrincipales(playlist_test)
});
0
ответ дан 01.12.2019, 14:40

Я смог прибыть в это:

Playlist.prototype.topArtist = function(){  
    let checker = [];                                   //array donde meto las bandas que ya he comprobado
    for(let i = 0; i < this.songs.length; i++){
            let cont = 0;
            let band = this.songs[i].getArtist(); 
             //-----CONDICION-----
                for(let banda of this.songs){
                    if(band == banda.getArtist()){
                        cont++;                         
                    }                       
                }
            checker.push(new Top(band, cont));          
    }
    orderByAppereances(checker);        
    temp = checker.slice(0, 5)
    return temp;        
}   
 //OUTPUT:
(5) [Top, Top, Top, Top, Top]
0: Top {band: "The kooks", appereances: 4}
1: Top {band: "The kooks", appereances: 4}
2: Top {band: "The kooks", appereances: 4}
3: Top {band: "The kooks", appereances: 4}
4: Top {band: "Nirvana", appereances: 2}
length: 5
__proto__: Array(0)

, но я не добиваюсь того, чтобы мне не повторили несколько раз каждая группа, попробовал помещать условие с .includes () и indexOf () перед for для того, чтобы, если band уже она включена в checker не между в этот for и следовательно не это añada больше раз, но я не способен....

-1
ответ дан 01.12.2019, 14:40