Combine multiple observable arrays into new object array

前端 未结 3 969
感情败类
感情败类 2021-01-14 01:44

I have 3 observable arrays like below.

persons = [
   {
      \"firstName\":\"john\",
      \"lastName\":\"public\",
      \"locationID\":\"1\",
      \"depa         


        
3条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-14 02:28

    It's not clear what exactly your observables are emitting, so I considered two options.

    let persons = [
        {
            "firstName":"john",
            "lastName":"public",
            "locationID":"1",
            "departmentID":"100"
        },
        {
            "firstName":"sam",
            "lastName":"smith",
            "locationID":"2",
            "departmentID":"101"
        }
    ];
    
    let departments = [
        {"departmentID": "100", "name": "development"},
        {"departmentID": "101", "name": "sales"}
    ];
    
    let locations = [
        {"locationID": "1", "name": "chicago"},
        {"locationID": "2", "name": "ny"}
    ];
    
    // Option 1: first observable emits persons one by one, 
    // locations and departments are emitted as whole arrays.
    let o1: any = Observable.from(persons);
    let o2: any = Observable.of(departments);
    let o3: any = Observable.of(locations);
    
    o1.withLatestFrom(o2, o3, (p, d, l) => {
        // here it is probably better to convert array to some kind of map or dictionary,
        // but I'm only showing Rxjs concept of doing such things.
        let location = l.find(c => c.locationID === p.locationID);
        let department = d.find(c => c.departmentID === p.departmentID);
        return {
            firstName: p.firstName,
            lastName: p.lastName,
            location: location ? location.name : "",
            department: department ? department.name : ""
        };
    }).subscribe((f) => {
        console.log(f);
    });
    
    // Option 2: all observables emit elements one by one.
    // In this case we need to convert departments and locations to arrays.
    o1 = Observable.from(persons);
    o2 = Observable.from(departments);
    o3 = Observable.from(locations);
    
    o1.withLatestFrom(o2.toArray(), o3.toArray(), (p, d, l) => {
        // this part of code is exactly the same as in previous case.
        let location = l.find(c => c.locationID === p.locationID);
        let department = d.find(c => c.departmentID === p.departmentID);
        return {
            firstName: p.firstName,
            lastName: p.lastName,
            location: location ? location.name : "",
            department: department ? department.name : ""
        };
    }).subscribe((f) => {
        console.log(f);
    });
    

提交回复
热议问题