如何计算对象中五个属性中有多少是非空的?

时间:2016-05-09 12:13:29

标签: javascript typescript

我有一个由这个Typescript接口表示的对象测试:

interface IWordForm {
    definition: string;
    sample1: string;
    sample2: string;
    sample3: string;
    sample4: string;
    sample5: string;
}

我需要的是创建一个函数,该函数将根据sample1,sample2,sample3,sample4和sample5中的多少定义为null来返回计数;

我想我可以使用一系列if语句来做到这一点,但是我可以使用现代浏览器功能做一个干净的方法吗?

5 个答案:

答案 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

Example in the playground here

答案 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;