javascript - 有没有办法检查返回对象/数组的Javascript函数是否为空?
问题描述
我在这里想要实现的是,我制作了一个简单的实用函数,它应该根据 isEmpty 方法的给定参数返回“true”或“false”。
// 下面的日志应该返回'false',但它返回'true'
console.log(isEmpty( () => {key: 1} ));
到目前为止我尝试了什么
function isEmpty(value) {
const type = typeof value;
if ((value !== null && type === 'object') || type === 'function') {
const properties = Object.keys(value);
return properties.length === 0 || properties.size === 0
}
return !value;
}
它适用于以下情况
console.log(isEmpty( {} )) // true
console.log(isEmpty( [] )) // true
console.log(isEmpty( Object.create(null) )) // true
console.log(isEmpty( null )) // true
console.log(isEmpty( '' )) // true
console.log(isEmpty( {key: 1} )) // false
console.log(isEmpty( [1,2,3] )) // false
但它不起作用,当我们从函数中获取返回对象/数组时
console.log(isEmpty( () => ({key: 1}) ))
console.log(isEmpty( () => ([1,2,3]) ))
解决方案
在函数上使用Object.keys()
总是会导致一个空数组(无论返回类型如何)。这是因为函数的键是不可枚举的(键是name
和length
),并且Object.keys()
只会返回可以枚举的键。这意味着键数组的长度将始终为,这意味着即使传递的函数返回非空值0
,您的函数也会返回。true
如果您可以调用value
(如果它是一个函数),它将允许您从中获取返回值(即:一个对象或数组),然后使用您当前拥有的函数进行递归:
function isEmpty(value) {
const type = typeof value;
if (value !== null && type === 'object') {
const prototype = Object.getPrototypeOf(value) || {};
const properties = Object.keys(value) + Object.keys(prototype);
return properties.length === 0 || properties.size === 0
} else if(type === 'function') {
const res = value();
return isEmpty(res);
}
return !value;
}
console.log(isEmpty( {} )) // true
console.log(isEmpty( [] )) // true
console.log(isEmpty( Object.create(null) )) // true
console.log(isEmpty( null )) // true
console.log(isEmpty( '' )) // true
console.log(isEmpty(() => ({}))); // true
console.log(isEmpty(() => () => () => ({}))); // true
console.log(isEmpty( {key: 1} )) // false
console.log(isEmpty( [1,2,3] )) // false
console.log(isEmpty(() => ({key: 1}))); // false
console.log(isEmpty( () => ([1,2,3]) )) // false
console.log(isEmpty(() => (Object.create({key: 1})))) // false
推荐阅读
- minio - 需要帮助添加 url 路径作为 minio 的端点
- python - Python 列表值在附加新值时更新,旧值丢失
- selenium-webdriver - 如何在属性文件下的xpath中动态传递文本
- portal - 如何更改门户登录页面中滚动条的颜色?
- javascript - 如何在博客中从数据库中加载数据?
- scala - 类型不匹配。必需:session.Expression[Boolean],找到:Validation[CheckBuilder[JsonPathCheckType, JsonNode, String]
- amazon-web-services - Elastic Beanstalk (EB2) 部署仅托管我的 FullStack 应用程序的后端 API
- swift - AWS Polly - 突出显示特殊字符
- javascript - 如何传递我在数据表中选择的数据进行插入
- python - 要求澄清使用 sorted lambda 对字典进行排序