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?