Tell us what’s happening:
remixPlaylistshould call the helper functions in order to produce the final schedule.
Test 14 still isn’t passing.
The result I logged looked correct to me.
console.log(remixPlaylist(playlists,1));
[ { slot: 1, trackId: 'trk101' },
{ slot: 2, trackId: 'trk102' },
{ slot: 3, trackId: 'trk103' },
{ slot: 4, trackId: 'trk201' } ]
Your code so far
const playlists = [
[
{
trackId: "trk101",
artist: "Velvet Comet",
title: "Crimson Afterglow",
votes: 5,
bpm: 122
},
{
trackId: "trk102",
artist: "Neon Harbor",
title: "Static Horizon",
votes: 2,
bpm: 108
},
{
trackId: "trk103",
artist: "Lunar Arcade",
title: "Midnight Frequency",
votes: 4,
bpm: 128
}
],
[
{
trackId: "trk201",
artist: "Solar Echo",
title: "Glass Skyline",
votes: 3,
bpm: 115
},
{
trackId: "trk202",
artist: "Velvet Comet",
title: "Satellite Hearts",
votes: 6,
bpm: 124
}
]
];
const flattenPlaylists = (lists) => {
// input is not an array
if (!Array.isArray(lists)) {
return [];
}
// input is an array containing arrays.
// each array containing objects.
// i is playlist index.
for (let i = 0; i < lists.length; i++) {
// j is track index.
for (let j = 0; j < lists[i].length; j++) {
if (
JSON.stringify(Object.keys(lists[i][j])) !==
JSON.stringify(["trackId", "artist", "title", "votes", "bpm"])
) {
return;
}
lists[i][j]["source"] = [i, j];
}
}
// lists.flat() is an array containing objects.
return lists.flat();
};
const scoreTracks = (tracks) => {
for (const track of tracks) {
track.score = track.votes * 10 - Math.abs(track.bpm - 120);
}
return tracks;
}
const dedupeTracks = (tracks) => {
for (let i = 0; i<tracks.length -1 ; i++) {
for (let j = i+1; j <tracks.length; j++) {
if (tracks[i].trackId === tracks[j].trackId) {
tracks.splice(j, 1);
}
}
}
return tracks;
}
const enforceArtistQuota = (tracks, max) => {
if (max < 1) {
return 0;
}
for (let i = 0; i<tracks.length -1 ; i++) {
let occurrences = 0;
for (let j = i+1; j <tracks.length; j++) {
if (tracks[i].artist === tracks[j].artist) {
occurrences++;
if (occurrences >= max) {
tracks.splice(j, 1);
}
}
}
}
return tracks;
}
const buildSchedule = (tracks) => {
let schedule = [];
for (let i = 0; i<tracks.length; i++) {
schedule.push({ slot: i+1, trackId: tracks[i].trackId});
}
return schedule;
}
const remixPlaylist = (lists, max) => {
let copy = [...lists];
let tracks = [];
tracks = flattenPlaylists(copy);
tracks = scoreTracks(tracks);
tracks = dedupeTracks(tracks);
tracks = enforceArtistQuota(tracks, max);
const remix = buildSchedule(tracks);
return remix;
}
Your browser information:
User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0
Challenge Information:
Build a Playlist Remix Engine - Build a Playlist Remix Engine