我有一个由这个Typescript接口表示的对象测试:
interface IWordForm {
definition: string;
sample1: string;
sample2: string;
sample3: string;
sample4: string;
sample5: string;
}
我需要的是创建一个函数,该函数将根据sample1,sample2,sample3,sample4和sample5中的多少定义为null来返回计数;
我想我可以使用一系列if语句来做到这一点,但是我可以使用现代浏览器功能做一个干净的方法吗?
答案 0 :(得分:3)
您可以使用Object.keys()遍历对象的属性(键),并仅查找看起来像“sample *”的那些。
var count = 0;
Object.keys(x).forEach((key) => {
if(key.indexOf('sample') === 0 && x[key] !== null) {
count++;
}
});
编辑回复有关界面属性的评论
在typescript中,接口纯粹是一个编译时构造。在运行时,您无法确定对象的属性以及界面的属性。
例如,Typescript:
interface IWordForm {
definition: string;
sample1: string;
sample2: string;
sample3: string;
sample4: string;
sample5: string;
}
class WordForm implements IWordForm {
definition: string;
sample1: string;
sample2: string;
sample3: string;
sample4: string;
sample5: string;
sample6: string;
}
汇编为:
var WordForm = (function () {
function WordForm() {
}
return WordForm;
}());
没有实际的JS定义接口。
答案 1 :(得分:2)
也许是这样的:
let prefix = "sample",
count = 0;
Object.keys(obj).forEach(key => {
if (key.substring(0, prefix.length) === prefix) {
count++;
}
})
Object.keys仅返回对象上的键,而不返回它从原型继承的属性,因此可以安全使用。
正如评论中提到的@CodingWithSpike,正则表达式可能是更好的解决方案:
let prefix = "sample",
regex = new RexExp("^" + prefix),
count = 0;
Object.keys(obj).forEach(key => {
if (regex.test(key)) {
count++;
}
});
答案 2 :(得分:0)
接口在运行时不存在,您不能使用Object.keys()。使用您要检查的明确键列表。
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return characteristics(toCollection(()-> new HashSet<>(initialCapacity)), UNORDERED);
}
或者像这样:
var count = ["definition", "sample1", "sample2", "sample3", "sample4", "sample5"].filter(k => k in obj && obj[k] != null).length;
为什么他不能使用Object.keys()
因为在运行时没有接口这样的东西。
var iWordFormNonNullKeys = Array.prototype.filter.bind(
["definition", "sample1", "sample2", "sample3", "sample4", "sample5"],
function(k){ return k in this && this[k] != null } //here you can't use a lambda-expression
);
var count = iWordFormNonNullKeys(someObj).length
obj匹配接口,无论您在哪里传递它。
但是Object.keys()还将测试非接口属性,并在这种情况下计数4。尽管非interface-properties具有非null值。
编辑:我错了。
如果你有一个好的过滤器,你可以使用Object.keys(),它只匹配你的接口的键。
var obj = {
//interface part
definition: null,
sample1: null,
sample2: null,
sample3: null,
sample4: null,
sample5: null,
//non-interface-properties
lorem: 13,
ipsum: 14,
dolor: 15,
sit: 16,
}
答案 3 :(得分:0)
这是最干净的&#34;我能想到的解决方案:
Object.keys(word).filter(key => /^sample/.test(key) && word[key] != null).length
示例:
function count(word:IWordForm):number {
return Object.keys(word).filter(key => /^sample/.test(key) && word[key] != null).length;
}
count({definition: "123", sample1: "a"}); // 1
count({definition: "123", sample1: "a", sample2: "b"}); // 2
count({definition: "123", sample1: "a", sample2: null, sample3: undefined}); // 1
答案 4 :(得分:0)
让我们说您的对象是
var datContract = {
prop1: string,
prop2: string,
prop3: number,
prop4: number,
prop5: string,
}
然后值为非空的键将为
Object.keys(this.datContract).filter(x => this.datContract[x]!= undefined);
计数为
Object.keys(this.datContract).filter(x => this.datContract[x]!= undefined).length;