2017-09-28 23 views
0

オブジェクトを持つ配列があります。これらの各オブジェクトには、itemID内に別のオブジェクトがあります。たとえば、IDが一致するオブジェクトと配列のマージ - 角2+ /イオン2+

hasObjectsが私の内部オブジェクトです。別のエンドポイントから取得している他のオブジェクトがあり、そのデータをこのinnerObjectIDに基づいてこの配列に結合したいと思います。ここでは、他のオブジェクトがどのように見えるかだ - それぞれが、それは私が上記の配列にそのデータを結合したい独自のAPI呼び出し

{ innerObjectID: 1, data: 1231231209381029381 } 
{ innerObjectID: 2, data: 13464531209381029381 } 

だです。だから私はその配列を見て、IDに基づいてオブジェクトを追加します。私が欲しいもの

[ 
    {object1: 123, hasObjects: {innerObjectID: 1, type: red, data: 1231231209381029381} 
    {object2: 124, hasObjects: {innerObjectID: 2, type: blue, data: 13464531209381029381} 
    {object3: 125, hasObjects: {innerObjectID: 2, type: blue, data: 13464531209381029381} 
    {object4: 127, hasObjects: {innerObjectID: 1, type: red, data: 1231231209381029381} 
    ] 

Component.ts

setItems(){ 

    this.service.setItems().subscribe((res) => { 
     this.items = res 

     this.stops.map(res => { 
     this.getIcons(res.hasObjects) 

     })  
    }) 
    } 

    getIcons(iconID){ 
     this.service.getIcons(iconID.imageID).subscribe(icon => { 
      this.newIcons = icon 

       icon.data = 'data:image/png;base64,' + icon.data; 
       let newObj = Object.assign(iconID.imageID, this.newIcons.innerObjectID) 
       console.log(newObj, 'new object') 
     }) 
    } 

以上何が起こっているが、私はちょうど、相関オブジェクト内のそのオブジェクトを追加することができ、結果を取得していないよです。

+0

コード内の対応するオブジェクト名はどれですか? – amal

答えて

0

オブジェクトの構造は少し混乱しますが、原則として、配列内のオブジェクトごとにリクエストを送信できます。その後、すべての要求が戻ってからコードを実行し、そこから新しい配列を作成するためにPromise.allを使用することができます。それは、この

const requests = [] 

objects.map(object => { 
    // Assuming this.getOtherObject() returns an observable with an object 
    // with the following signature { innerObjectID: 1, data: 123 } 
    requests.push(this.getOtherObject(object.hasObjects.innerObjectID).toPromise()) 
}) 

Promise.all(requests).then(res => { 
    const newItems = [] 

    // res is an array containing all the responses from the requests 
    res.map(innerObject => { 
    const object = objects.find(
     object => object.hasObjects.innerObjectID === innerObject.innerObjectID 
    ) 

    newItems.push({ 
     ...object, 
     hasObjects: { ...object.hasObjects, data: innerObject.data } 
    }) 
    }) 

    this.items = newItems 
}) 

に似て見ることができる

私は、コードをテストしていないが、うまくいけば、これはあなたにそれを行う方法のアイデアを提供します。

+0

配列 "push"は配列の長さを返します。 object.map関数では、数値をオブジェクト配列にマップしませんか? – omeralper

+0

私はあなたが正しく言っているコードの部分を理解できないかもしれませんが、 'push'は配列の最後に要素を追加します。私たちは何かの戻り値を必要としません。コードの2行目の – emroussel

+0

では、requests.push関数はリクエスト配列の長さを返します。したがって、map関数はオブジェクト配列を数字だけで塗りつぶします。私はプッシュ関数が項目を配列にプッシュすることを知っていますが、関数自体は配列の長さを返します。 – omeralper

0

地図機能には約束が必要なので、地図機能にはマッピングが必要なのでお勧めできませんが、サーバにリクエストを送信すると、約束しかできません。マップ機能を与えるものは何もありません。あなたの配列を横断してあなたのすべてのアイテムをリクエストしてください。このコードは正常に動作するはずです:

setItems(){  
    this.service 
     .setItems() 
     .subscribe((res) => { 
      this.items = res; 

      this.items.forEach((item, i, arr) => { 
      this.getIcons(arr[i]);//here we pass by reference 
      });  
     }); 
} 

getIcons(item){ 
     this.service 
      .getIcons(item.hasObjects.innerObjectID)//null check here 
      .subscribe(icon => { 
       item.hasObjects.data = icon.data; 
     }) 
    } 
+0

getIcons関数でconsole.log(item)を実行すると、配列の最初のオブジェクトが不幸にしか取得されません – userlkjsflkdsvm

関連する問題