2016-06-13 8 views
4

いくつかのオブジェクトをいくつか実装していますが、追加のプロパティもあります。 私は(ファイルに保存するために)それらをシリアル化するときに、私はすべてのthos追加のプロパティを削除し、インターフェイスに一致するプロパティのみを保持したいと思います。フィルタオブジェクトのプロパティが一致するインターフェイス

特定のインターフェイスに関するオブジェクトを「クリーン」する方法はありますか。 私はオブジェクトのプロパティの完全なリストを取得し、界面特性の完全なリストと比較する

Object.getOwnPropertyNames(myObject) 

をしようとしていたが、私は界面特性

のリストを取得する方法を見つけることができません

編集:

var object = <IMyInterface>{}; 

How can I create an object based on an interface file definition in TypeScript?

しかし、私はObject.getOwnPropを使用するときに私はそれを見た:私はここに方法を見つけましたertyNames(myObject)、これは定義されたプロパティに対してのみ動作します。プロパティが定義されていない場合、結果には含まれません。定義されたプロパティだけでなく、すべての使用可能なプロパティを取得する方法はありますか?

+0

プロパティの例を投稿できますか? Personオブジェクトの例: –

+0

:名前、姓、年齢、性別。また、IPersonのようなインターフェイスでは、名前、姓、年齢などがあります。 "gender"プロパティを除いてオブジェクトを保存できるようにしたいと考えています。 – Lempkin

+0

インタフェースは実行時に存在しないため、実行できません。できることは、そのインターフェイスのプロパティ名で構成されたインターフェイスごとにリストを作成し、それを実行時に反復することです。 –

答えて

1

このコードをチェックアウト:

interface MyInterface1 { 
    field1: string; 
    field2: string; 
} 

interface MyInterface2 { 
    field3: string; 
    field4: string; 
} 

let o1 = { 
    field1: "field1", 
    field2: "field2", 
    fieldN: "fieldN" 
} as MyInterface1; 

let o2 = { 
    field3: "field3", 
    field4: "field4", 
    fieldN: "fieldN" 
} as MyInterface2; 

それはにコンパイル:だからあなたはコンパイル(JS)のコードではインターフェースがないことがわかります

var o1 = { 
    field1: "field1", 
    field2: "field2", 
    fieldN: "fieldN" 
}; 
var o2 = { 
    field3: "field3", 
    field4: "field4", 
    fieldN: "fieldN" 
}; 

code in playground

存在しているので、あなたは(実行時に)保持する必要のあるプロパティが何であるかを知る方法がありません。あなたは何ができるか

は次のとおりです。

let myInterface1Keys = ["field1", "field2"]; 
interface MyInterface1 { 
    field1: string; 
    field2: string; 
} 

let o1 = { 
    field1: "field1", 
    field2: "field2", 
    fieldN: "fieldN" 
} as MyInterface1; 

let persistableO1 = {} as MyInterface1; 
Object.keys(o1).forEach(key => { 
    if (myInterface1Keys.indexOf(key) >= 0) { 
     persistableO1[key] = o1[key]; 
    } 
}); 

code in playground

+0

はいこれはうまくいくと思います。これは私の最後の選択です。私はそれらの余分なベクトルをすべて作り直す必要はありません。 – Lempkin

+0

インターフェイスの代わりに 'class'を使うことができれば、デコレータあなたが望むことをするために使用することができます。 –

+0

の代わりにobject.key()を使用してください。foreachあなたはlodashから選択できます: 'persistableO1 = _.pick(o1、myInterface1Keys)' – CharybdeBE

-3

あなたは次のように行うことができます。

var app = angular.module("myapp", []); 
 
app.controller("AppCtrl", function($scope){ 
 
    $scope.person = { 
 
    name : "John", 
 
    surname : "Doe", 
 
    age : 50, 
 
    gender : "male" 
 
\t }; 
 
}); 
 

 
app.filter("myfilter", function(){ 
 
    return function (input, excludeItem) { 
 
    delete input[excludeItem]; 
 
    return input; 
 
    } 
 
});
<html> 
 
    <head> 
 
    <title>Solutions-1</title> 
 
    </head> 
 
    <body ng-app="myapp"> 
 
    <div ng-controller="AppCtrl"> 
 
     <div ng-repeat="(key, value) in person | myfilter:'gender'">{{key}} : {{value}}</div> 
 
    </div> 
 
    <script src = "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> 
 
    </body> 
 
</html>

デモ:http://codepen.io/Asit124/pen/ZOWJeM

関連する問題