Ho seguito i tutorial di RxJS link . Quasi tutti gli esercizi prevedono il passaggio da una struttura gerarchica a una struttura piatta, quindi ho pensato di provare a fare il contrario.
Voglio convertire da una matrice piatta a una struttura ad albero basata su una proprietà di ciascun elemento dell'array, utilizzando gli stessi costrutti funzionali del tutorial.
vale a dire. Vai da questo:
var videos = [
{
"id": 70111470,
"title": "Die Hard",
"category": "Action"
},
{
"id": 654356453,
"title": "Bad Boys",
"category": "Action"
},
{
"id": 65432445,
"title": "Anchorman",
"category": "Comedy"
},
{
"id": 675465,
"title": "Everest",
"category": "New Release"
}
];
A questo (in base alla categoria di ciascun video):
result === [
{
"category": "Action",
"videos": [
{
"id": 70111470,
"title": "Die Hard"
},
{
"id": 654356453,
"title": "Bad Boys"
}
]
},
{
"category": "Comedy",
"videos": [
{
"id": 65432445,
"title": "Anchorman"
}
]
},
{
"category": "New Release",
"videos": [
{
"id": 675465,
"title": "Everest"
}
]
}
];
Ho trovato il seguente codice che funziona, ma mi sento come se mi mancasse un modo più semplice (magari risolvendo in una singola riduzione) che a sua volta sarebbe più performante (piuttosto che filtrare i video molte volte):
var result =
videos.reduce(function(catArray, video) {
var catName = video.category;
if (catArray.indexOf(catName) === -1) {
catArray.push(catName);
}
return catArray;
}, [])
.map(function(categoryName) {
return {
category: categoryName,
videos: videos.filter(function(video) {
return video.category === categoryName;
}).map(function(video) {
return {
id: video.id,
title: video.title
};
})
};
});
C'è un modo migliore di utilizzare i metodi funzionali?