我有一些对象实现了一些接口,但是它们也有额外的属性。当我来序列化它们(保存在文件中)时,我想删除所有这些额外的属性,只保留与接口匹配的属性。
有没有办法“清理”有关给定接口的对象。我正在尝试
Object.getOwnPropertyNames(myObject)
要获取对象属性的完整列表,并与接口属性的完整清单进行比较,但我无法找到获取接口属性列表的方法
编辑:我在这里找到了一种方法:如何基于TypeScript中的接口文件定义创建对象?
跟
var object = <IMyInterface>{};
但是我看到当我使用 Object.getOwnPropertyNames(myObject) 时,这仅适用于定义的属性,如果未定义属性,则它不在结果中。有没有一种方法可以获取所有可用的属性,而不仅仅是定义的属性?
您可以执行以下操作:
var app = angular.module("myapp", []);
app.controller("AppCtrl", function($scope){
$scope.person = {
name : "John",
surname : "Doe",
age : 50,
gender : "male"
};
});
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>
我非常喜欢@Nitzan的回答,但我遇到的一个问题是,当我更新类型时,硬编码到字符串数组中的键不会更新,导致错误,否则会被typescript捕获。因此,我建议您也键入键字符串数组,以便在以后更改类型时,typescript也会提示您更新它:
interface MyInterface1 {
field1: string;
field2: string;
}
let o1 = {
field1: "field1",
field2: "field2",
fieldN: "fieldN"
} as MyInterface1;
let myInterface1Keys: Array<keyof MyInterface1> = ["field1", "field2"]; //<--------
let persistableO1 = {} as MyInterface1;
Object.keys(o1).forEach(key => {
if (myInterface1Keys.indexOf(key) >= 0) {
persistableO1[key] = o1[key];
}
});
查看此代码:
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;
它编译成:
var o1 = {
field1: "field1",
field2: "field2",
fieldN: "fieldN"
};
var o2 = {
field3: "field3",
field4: "field4",
fieldN: "fieldN"
};
(操场上的代码)
因此,您可以看到,在编译的(js)代码中,接口不存在,因此您无法知道(在运行时)需要保留哪些属性。
您可以做的是:
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];
}
});
(操场上的代码)
问题内容: 我有一个带有一系列对象属性的对象,这些对象属性具有以下相似的结构(这是从服务返回数据的方式): 当我执行ng-repeat时,我可以遍历所有这5个对象,例如: 但是, 我真正想要做的是仅对那些不是“ foo”类型的项进行迭代 ,即3次迭代而不是5次。我知道可以以某种方式利用过滤器来执行此操作,但是我不确定如何执行。我尝试了以下方法: 但这不起作用。实际上,即使执行以下操作以将对象限制为
我有一个名为的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示: 具有各自的吸气器和设置器。是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是或。 我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为的列表中。到目前为止,我的方法只是遍历列表,并返回与和匹配的第一个: 然而,这完全忽视了一个事
问题内容: 我在javascript中有一组对象。内容看起来像这样; 我想保留一些对象并删除其余的对象。如果object属性为2或34,则将保留对象。其他对象被删除。遗嘱的结果看起来像这样; 我正在使用node.js v6.91。 编辑:有人建议我使用过滤器来解决这种问题。欢迎使用过滤器技术的答案。 问题答案: 您可以尝试以下方法1和2: 方法1 :(使用) 注意:这将返回一个新数组,并且不会修改
问题内容: 我试图在AngularJS中创建一个自定义过滤器,该过滤器将通过特定属性的值过滤对象列表。在这种情况下,我要按“极性”属性(“正”,“中性”,“负”的可能值)进行过滤。 这是我没有过滤器的工作代码: HTML: 这是JSON格式的“ $ scope.tweets”数组: 我可以提出的最佳过滤器如下: 此方法返回一个空数组。从“ console.log(polarity)”语句中不会打印
问题内容: 是否可以通过多个值过滤对象数组? 例如,在下面的示例中,我可以按term_ids 5和6进行过滤,然后同时键入car吗? 如果可以轻松使用,肯定可以使用库。 问题答案: 您可以使用Array.filter
问题内容: 我有以下JavaScript数组的房地产主页对象: 我想做的是能够对对象执行过滤,以返回“家庭”对象的子集。 例如,我想根据能够过滤:,,,和。 如何在JavaScript中执行类似下面的伪代码的操作: 注意,语法不必与上面完全相同。这只是一个例子。 问题答案: 您可以使用以下方法: 现场示例: 此方法是新ECMAScript 5th Edition标准的一部分,几乎可以在所有现代浏览