首页 > 解决方案 > 如何在对象的对象中找到空/未定义的值

问题描述

在包含 Json、数组和任何其他数据类型的对象中查找空值/未定义或空值的最佳方法是什么?

一种替代方法是使用字符串搜索,但我不确定这是否是一种好习惯:

myObject = [{foo: 10, bar: 'NY'}, 123, [null, 11, '', 22], undefined, {baz: 99, quz: undefined}];


function containsInvalidValue(object) {
    myString = JSON.stringify(object);
    console.log(myString);
    let containsNull = myString.search("null"),
    containsUndefined = myString.search("undefined"),
    containsEmpty = myString.search("\"\""),
    containsInvalidValue = containsNull + containsUndefined + containsEmpty;
    if(containsInvalidValue < 0)
        return false;
    else
        return true;
}

console.log(containsInvalidValue(myObject));

这种方法的第一个问题是JSON.stringify()不会将undefined字段包含到 json 对象中。因此,该JSON.stringify(object)行返回以下内容:

"[{"foo":10,"bar":"NY"},123,[null,11,"",22],null,{"baz":99}]"

它忽略quz: undefined了json中的。

标签: javascriptarraysjson

解决方案


这有点 hacky,但一种选择是使用JSON.stringify一个函数来检查被字符串化的值是nullor undefined

const myObject = [{foo: 10, bar: 'NY'}, 123, [null, 11, '', 22], undefined, {baz: 99, quz: undefined}];


function containsInvalidValue(object) {
  let hasNullOrUndef = false;
  JSON.stringify(object, (key, val) => {
    if (val === null || val === undefined) {
      hasNullOrUndef = true;
    }
    return val;
  });
  return hasNullOrUndef;
}

console.log(containsInvalidValue(myObject));

或者手动递归迭代:

const myObject = [{foo: 10, bar: 'NY'}, 123, [null, 11, '', 22], undefined, {baz: 99, quz: undefined}];

const check = (val) => {
  if (val === null || val === undefined) {
    return true;
  }
  if (typeof val !== 'object') {
    return false;
  }
  for (const item of Object.values(val)) {
    if (check(item)) {
      return true;
    }
  }
  return false;
};
console.log(check(myObject));


推荐阅读