2017-01-05 8 views
0

私の角2のアプリケーションでは、2つのオブジェクト配列を宣言しました。 Typescriptフィルタメソッド

users: User[]; 
selectedUsers: User[]; 

は今、私はcheckedプロパティ真であるオブジェクトの配列を返すように filter()メソッドを使用しています。

this.selectedUsers = this.users.filter(user => user.isChecked == true); 

問題は、両方の配列の要素の参照が同じであることです。 オブジェクトをフィルタリングして新しいオブジェクトの配列(新しい参照)を返す方法はありますか?

ためlodashを実装する:あなたが機能( "lodash" ライブラリ)を_.cloneDeep使用することができます

this.users.filter(user => user.isChecked).map(u => Object.assign({},u)); 
+0

ですから、そのすべてのユーザーのクローンを持つ新しい配列をしたいですチェックされていますか? –

+0

これは動作しません。なぜなら、filterはboolを返す関数を期待しており、結果を気にしません。これはうまくいくはずです: 'this.selectedUsers = this.users.filter(user => user.isChecked == true).map(ユーザ=> deepCloneUser(ユーザ));'。深いクローンを書くのが手間がかかりすぎるなら、lodash&coにはユーティリティメソッドがあります。 – Matthias247

+0

@Pabloはい。基本的に 'isChecked'と同じプロパティを持つ新しいオブジェクトを作成します。 – kiranghule27

答えて

7

あなたは常に新しい配列を作成するためにArray.prototype.mapを使用することができますし、Object.assignは、新しいオブジェクトを作成するにはtypescriptですに以下のものが必要です。

npm i -S lodash 

と@types LIB:

npm i -S @types/lodash 

し、あなたのコード内:

import * as _ from 'lodash' 

let cloneCheckedObject = _.cloneDeep(this.users.filter(user => user.isChecked); 
+0

私の特別なケースでは、オブジェクトuの新しいプロパティを割り当てるためにObject.assign(user、u)を書く必要があります(ドキュメントで理解した通りです) – kiranghule27

1

は@Amirの答えを取ると、それはほんの少しよりtypescriptです優しい作りましょう:

this.users.filter(user => user.isChecked).map(u => {...u}); 
+0

'map'ハンドラは間違っています。 '({... u})'や 'return' – Uzi

関連する問題