我有一个添加新联系人的模式,为了禁用保存按钮(如果没有输入数据),我检查联系人对象是否为空,是否有更短的方法检查空复杂对象?
let isContactEmpty = true
Object.keys(contact).forEach(field => {
if (typeof contact[field] === 'string' && contact[field]) {
isContactEmpty = false
return
}
if (typeof contact[field] === 'object') {
contact[field].forEach(fieldVal => {
if (fieldVal.value.length) {
isContactEmpty = false
}
})
}
})
发布于 2021-02-04 03:38:44
.forEach()
而不是for-of
有什么特别的原因吗?因为.forEach()
使用一个函数进行迭代,所以一旦您知道联系人不是空的,就没有办法提前停止。如果您使用的是for-of
,那么一旦您知道结果是假的,就可以只使用return false
。typeof value === 'object'
来检查某个东西是否是一个数组。相反,您可以执行Array.isArray(value)
。Object.values()
循环这些值呢?应用了这些建议后,您的代码如下所示:
function isContactEmpty(contact) {
for (const field of Object.values(contact)) {
if (typeof field === 'string' && field) {
return false
} else if (Array.isArray(field)) {
for (const { value } of field) {
if (value.length) return false
}
}
}
return true
}
但是,我们可以更进一步。Javascript有一个更高级别的函数来完成我们使用这些循环所做的事情,但是没有样板- array.every()
。它接受一个回调,该回调返回一个布尔值,并与数组的每个元素一起调用。如果所有回调返回true,则every()的返回值为true,如果其中一个回调返回false,则返回false。(当一个回调返回false时,它也将停止迭代)。
const isContactEmpty = contact => (
Object.values(contact).every(field => {
if (typeof field === 'string') return !field
if (Array.isArray(field)) return areArrayEntriesEmpty(field)
return true
})
)
const areArrayEntriesEmpty = field => (
field.every(({ value }) => value.length === 0)
)
https://codereview.stackexchange.com/questions/255547
复制相似问题