当前位置: 首页 > 知识库问答 >
问题:

过滤对象属性匹配接口

艾安和
2023-03-14

我有一些对象实现了一些接口,但是它们也有额外的属性。当我来序列化它们(保存在文件中)时,我想删除所有这些额外的属性,只保留与接口匹配的属性。

有没有办法“清理”有关给定接口的对象。我正在尝试

Object.getOwnPropertyNames(myObject)

要获取对象属性的完整列表,并与接口属性的完整清单进行比较,但我无法找到获取接口属性列表的方法

编辑:我在这里找到了一种方法:如何基于TypeScript中的接口文件定义创建对象?

var object = <IMyInterface>{};

但是我看到当我使用 Object.getOwnPropertyNames(myObject) 时,这仅适用于定义的属性,如果未定义属性,则它不在结果中。有没有一种方法可以获取所有可用的属性,而不仅仅是定义的属性?

共有3个答案

厉文栋
2023-03-14

您可以执行以下操作:

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>
李浩邈
2023-03-14

我非常喜欢@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];
    }
});

孟修竹
2023-03-14

查看此代码:

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标准的一部分,几乎可以在所有现代浏览