2017-06-21 9 views
1

私はループを作成してオブジェクトを作成します。ループはいつも同じ最後の値を返します

Action.ts

public campaing:any = { 
    'id': '', 
    'campaing_code': '', 
    'campaing_type': '', 
    'start_date': this.currentDate, 
    'end_date': this.currentDate, 
    'deadline': this.currentDate, 
    'creation_date': this.currentDate, 
    'special': false, 
    'os': '', 
    'country': '', 
    'campaing_country': 'germany', 
    'version_app': '', 
    'permanent_promo': false, 
    'promo_tag': 'ABS-W-', 
    'editor_name': '', 
    'plus_promotag': '', 
    'status': 'Successful', 
    'application': {}, 
    'publisher': {}, 
    'contact': '', 
    'sended': false 
    }; 
    public searchparram: any = { 
    'type': '', 
    'time': '', 
    'start_date': this.currentDate, 
    'deadline': this.currentDate, 
    'publisher': {}, 
    'wildcard': false, 
    'os': '', 
    'category': '', 
    'number_campaings': 1 
    } 
public suggescampaings:any = [];  
public generateCampaings(){ 
     this.campaing.campaing_code = this.searchparram.type; 
     this.campaing.start_date = this.searchparram.start_date; 
     this.campaing.deadline = this.searchparram.deadline; 
     this.campaing.publisher = this.searchparram.publisher; 
     this.campaing.os = this.searchparram.os; 
     for (let i = 1; i <= this.searchparram.number_campaings; i++) { 
      ((i)=>{ 
      this.campaing.id = i; /* Here should print i but alway print the last value of i */ 
      this.suggescampaings.push(this.campaing); 
      })(i); 
     } 
     } 

しかし、私はcamaping.idを入れしようとする=私は、常に反復の最後の値を返します。私はitereionが8回IDであることを常に意味します。

だからアイデアを入れて反復を行い、次にオブジェクトに配列をプッシュすることです。

+1

あなたはもちろん、同じオブジェクト( 'this') – Andreas

+0

を変更しているので、それが唯一の最後を持っています値。各ループで 'this.campaing.id'を上書きしています。あなたは何を期待しましたか? – Saravana

答えて

1

問題は、ループごとに同じthis.campaingオブジェクトを変更することです。あなたは各ループのための新しいオブジェクトをプッシュすることを意図している場合、あなたは簡単にObject.assignを使用してコピーを作成することができます。

for (let i = 1; i <= this.searchparram.number_campaings; i++) { 
    ((i) => { 
    let copy = Object.assign({}, this.campaing); 
    copy.id = i; 
    this.suggescampaings.push(copy); 
    })(i); 
} 
+0

完璧なお手伝いをさせていただきありがとうございます。 –

0

問題はループではありません。オブジェクトを配列suggescampaingsにプッシュする前に新しいオブジェクトを作成していないためです。同じオブジェクトcampaingが複数回上書きされており、配列を表示すると同じオブジェクト(つまり最後のオブジェクト)が複数回表示されます。

提案:ループ内に新しいテンポラリオブジェクトを作成し、配列に挿入します。

+0

ループ内に新しい一時オブジェクトを作成しようとしましたが、それでも同じことが起こります。 'let newcampaing:any = {}' でも、同じようなことが起こります。 –

+0

一時的なキャンプオブジェクトを作成するには、オブジェクトを複製する必要があります。その参照は同じではありません。 –

関連する問題