Vejo várias maneiras de abordar isso. Provavelmente, eu seguiria uma dessas opções. Vamos trabalhar com o caso genérico em que queremos uma playlist com as músicas M2, M1, M3 e o vídeo V2:
- Criar uma lista ordenada que guarda uma referência para cada entidade.
const endidades = [
{id: 'm1', name: 'Musica 1'},
{id: 'm2', name: 'Musica 2'},
{id: 'm3', name: 'Musica 3'},
{id: 'v2', name: 'Video 2'}]
const listaComPosicoes = ['m2', 'm1', 'm3', 'v2']
// Exemplo simples sem considerar performance
listaComPosicoes
.forEach(id => console.log(endidades.find(e => e.id === id)))
/*
{
"id": "m2",
"name": "Musica 2"
}
{
"id": "m1",
"name": "Musica 1"
}
{
"id": "m3",
"name": "Musica 3"
}
{
"id": "v2",
"name": "Video 2"
}
*/
- Salvar a posição da entidade em si.
const endidadesComPosicao = [
{id: 'm1', name: 'Musica 1', position: 1},
{id: 'm2', name: 'Musica 2', position: 0},
{id: 'm3', name: 'Musica 3', position: 2},
{id: 'v2', name: 'Video 2', position: 3},]
endidadesComPosicao
.sort((a,b) => a.position - b.position)
.forEach(x => console.log(x))
/*
{
"id": "m2",
"name": "Musica 2",
"position": 0
}
{
"id": "m1",
"name": "Musica 1",
"position": 1
}
{
"id": "m3",
"name": "Musica 3",
"position": 2
}
{
"id": "v2",
"name": "Video 2",
"position": 3
}
*/
- Salvar em uma entidade intermediária, como você sugeriu.
Qual é o melhor?
Aquele que melhor se ajusta ao código que você já tem em funcionamento. Um benchmark de desempenho pode ser útil caso o desempenho seja crucial na decisão.