首页 > 解决方案 > 有没有办法检查返回对象/数组的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]) )) 

标签: javascriptarraysobject

解决方案


在函数上使用Object.keys()总是会导致一个空数组(无论返回类型如何)。这是因为函数的键是不可枚举的(键是namelength),并且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


推荐阅读