Roland Nasr
Roland Nasr

Reputation: 90

RxJs - FlatMap Object with Observable Property

I'm struggling with a simple RxJs query that I can't seem to wrap my head around. I can't seem to figure out how to merge Observables if they are wrapped inside an object. This example works as expected if I just directly return the Observable from flatMap, but I also need the name in my output. How can I achieve this?

I'm using RxJS 5.0.0-beta.2

Basic Data Structure:

var data = [
  {
    "name": "Test #1",
    "users": [
      {
        "name": "John Doe",
        "gender": "male"
      },
      {
        "name": "John Doe",
        "gender": "male"
      },
      {
        "name": "Jane Doe",
        "gender": "female"
      }
    ]
  },
  {
    "name": "Test #2",
    "users": [
      {
        "name": "John Doe",
        "gender": "male"
      },
      {
        "name": "Jane Doe",
        "gender": "female"
      },
      {
        "name": "Jane Doe",
        "gender": "female"
      }
    ] 
  }
];

RxJs Function:

Observable.fromArray(data)
  .flatMap(x => {
    return Observable.of({
      "name": x.name, 
      "count": Observable.fromArray(x.users)
                .filter(x => x.gender == "male")
                .count()
      })
  })
  .toArray()
  .subscribe(result => {
    console.log(result);
  });

Desired Result:

result = [
    {
      "name": "Test #1",
      "count": 2
    },
    {
      "name": "Test #2",
      "count": 1
    }
  ];

Actual Result:

result = [
    {
      "name": "Test #1",
      "count": Observable
    },
    {
      "name": "Test #2",
      "count": Observable
    }
  ];

Upvotes: 0

Views: 1427

Answers (1)

Francesco Pezzella
Francesco Pezzella

Reputation: 1795

Observable.fromArray(data)
.flatMap(x => {
  return Observable.of({
    "name": x.name, 
    "count": x.users
              .filter(x => x.gender == "male")
              .length
  });
})
.toArray()
.subscribe(result => {
  console.log(result);
});

Upvotes: 1

Related Questions