Merge subarrays using Observables

后端 未结 2 1255
执笔经年
执笔经年 2020-12-02 03:06

I have this data structure:

[{
    id : 1,
    name : \"Item 1\",
    subItems : [{
            id : 1,
            name : \"SubItem 1\"
        },{
                 


        
相关标签:
2条回答
  • 2020-12-02 03:44

    You want to first map() operator to extract only fields you need and them flatten the arrays of objects with concatAll() (it's a little trick with higher order Observables, see Subscribing to a nested Observable for more info):

    var data = [{
        id : 1,
        name : "Item 1",
        subItems : [
            { id : 1, name : "SubItem 1" },
            { id : 2, name : "SubItem 2" }
        ]
    }, {
        id : 2,
        name : "Item 2",
        searchProfiles : [
            { id : 3, name : "SubItem 3" },
            { id : 4, name : "SubItem 4" }
        ]
    }];
    
    Observable.from(data)
        .map(item => {
            if (item.searchProfiles) {
                return item.searchProfiles;
            } else if (item.subItems) {
                return item.subItems
            }
        })
        .concatAll()
        .subscribe(val => console.log(val));
    

    This prints to console:

    { id: 1, name: 'SubItem 1' }
    { id: 2, name: 'SubItem 2' }
    { id: 3, name: 'SubItem 3' }
    { id: 4, name: 'SubItem 4' }
    

    Alternatively, if you really want the output as a single array then you can add toArray() operator between .concatAll() and .subscribe(...) and you'll receive:

    [ { id: 1, name: 'SubItem 1' },
      { id: 2, name: 'SubItem 2' },
      { id: 3, name: 'SubItem 3' },
      { id: 4, name: 'SubItem 4' } ]
    
    0 讨论(0)
  • 2020-12-02 03:49

    Provided it is a typo and the second element has subItems as well (and not searchProfiles), you don't need flatMap or any thing of the sort, you can do it in a plain map using js array operators:

    var transformed = [].concat(...result.map(item => item.subItems));
    

    or in your case

    httpResult$.map(result => [].concat(...result.map(item => item.subItems))
    

    if the use of different keys is deliberate, your internal map will require a bit more logic but the mapping will be quite the same

    0 讨论(0)
提交回复
热议问题