说我有一个数组,就像这样:
arr = [{}, {}, {}, {}]
我希望能够知道数组的长度,只计算其中具有至少一个属性的对象。
[{}, {name: "Derby County", odds: 2}, {}, {}] // 1
[{}, {name: "Derby County", odds: 2}, {name: "Fullham", odds: 3} ,{}] // 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
的静态检查。如果假设被打破,那么会引发错误,这是我通常希望得到的。我没有隐藏运行时错误。如果此处存在运行时错误,我将回顾一下假设。但是我不确定情况是否如此。