javascript 如何检查嵌套对象中值是否为空

o8x7eapl  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(193)

对于条件渲染,我检查我的对象是否得到一个空值。
我使用“useState”将每个对象值传递给“isEmpty”。首先,我创建一个新对象,因为我删除了可以为空的值“SummaryOfChanges”。然后,我使用“some”获取每个值并将每个值传递给“isEmpty”
//使用效果

useEffect(() => {
    if (offerData) {
      let myObject = { ...offerData };
      const { SummaryOfChanges, ...newObject } = myObject;
      
      if (Object.values(newObject)?.some((x) => isEmpty(x))) {
        setCheckIfEmpty(true);
      } else {
        setCheckIfEmpty(false);
      }
    }
  }, []);

//空

export const isEmpty = (value) => {
  return (
    value === undefined ||
    value === null ||
    (typeof value === 'object' && Object.keys(value).length === 0) ||
    Object.keys(value) === undefined ||
    Object.keys(value) === null ||
    (typeof value === 'string' && value.trim().length === 0)
  );
};

我的对象的例子:

offerData : {
  valueOne : "hello",
  objectOne : { 
    valueOne: 'Hello', 
    valueTwo : null}
}

问题:isEmpty工作正常,如果值、嵌套对象或数组为空,则检入我的对象。但有时候,嵌套对象不是空的,而是值为“null”。
我需要在“isEmpty”中添加一些条件来检查嵌套对象和数组中的每个值。
因此,在这种情况下,setCheckIfEmpty将返回'false',因为我的“objectOne”不为空,即使“objectOne.valueTwo”=== null。
实际上,我试图Map每个值,但目前它不起作用。

t9eec4r0

t9eec4r01#

要递归地检查对象,应该修改isEmpty函数,使其在嵌套对象上调用自身:

export const isEmpty = (value) => {
  if (typeof value === 'object' && value !== null) {
    for (const v of Object.values(value)) {
      if (isEmpty(v)) return true;
    }
  }

  return (
    value === undefined ||
    value === null ||
    (typeof value === 'object' && Object.keys(value).length === 0) ||
    // Also these lines aren't needed because Object.keys() always returns an array
    // Object.keys(value) === undefined ||
    // Object.keys(value) === null ||
    (typeof value === 'string' && value.trim().length === 0)
  );
};
yk9xbfzb

yk9xbfzb2#

要在对象的值或任何子对象中进行搜索,无论子对象的内部有多深,都可以使用递归:

// Return true if object has a null, undefined, empty string or empty object value or if any children (however deep inside the children might be) has these value:
function isEmpty(myObject) {
  for(var key in myObject) {
    if(myObject[key] == null || myObject[key] == undefined) return true;
    if((typeof myObject[key] === 'object' && Object.keys(myObject[key]).length === 0)) return true;
    if((typeof myObject[key] === 'string' && myObject[key].trim().length === 0)) return true;
    if(myObject[key] instanceof Object) return isEmpty(myObject[key]);
  }
  
  return false;
}

测试:

let o = {
  valueOne : "hello",
  objectOne : { 
    valueOne: 'Hello', 
    valueTwo : null}
}

isEmpty(o); //true

相关问题