如何查找数组内的对象是否不为空?

时间:2019-03-09 02:21:30

标签: javascript arrays json

说我有一个数组,就像这样:

arr = [{}, {}, {}, {}]

我希望能够知道数组的长度,只计算其中具有至少一个属性的对象。

[{}, {name: "Derby County", odds: 2}, {}, {}] // 1

[{}, {name: "Derby County", odds: 2}, {name: "Fullham", odds: 3} ,{}] // 2

我该如何实现?

2 个答案:

答案 0 :(得分:1)

如果您这样做:

arr.map(x=> Object.keys(x).length)

您将获得:

[ 0, 0, 0, 1 ]

如果对象为空,则没有键,因此其长度为0。

如果您需要对的话,请执行以下操作:

arr.map(x=> Object.keys(x).length).some(x=>x>0)

示例:

console.log("[{},{}]", [{},{}].map(x=> Object.keys(x).length).some(x=>x>0))

console.log("[{},{a: 1}]", [{},{a: 1}].map(x=> Object.keys(x).length).some(x=>x>0))

答案 1 :(得分:1)

arr.filter(x => Object.keys(x).length).length

如其他答案所述,Object.keys()从给定对象返回属性名称。内部的.length是仅过滤具有至少一个属性的项目的快捷方式。外面的.length告诉我们有多少个对象符合说明。

更新:

[].filter()方法采用一个函数,该函数返回一个thruthy / falsy值。大于0的数字是可以通过的,因此它与.length !== 0相同。

这里的假设是数组中包含的任何元素都不为空。在这种假设下,在[].filter()内部检查对象是否为null毫无意义。使用TypeScript时,它是对arr的静态检查。如果假设被打破,那么会引发错误,这是我通常希望得到的。我没有隐藏运行时错误。如果此处存在运行时错误,我将回顾一下假设。但是我不确定情况是否如此。