当前位置: 首页 > 知识库问答 >
问题:

从对象内部的对象查找未定义或空值

谭新知
2023-03-14

如果发现未定义或为空,我想在数组中按下键

const obj = {
  name:'ab',
  edu:'av',
  degres:{
    a1:'',
    b1:'1'
  },
  platform:undefined
 }

我想要像这样的输出

  `['a1','platform']`

因为a1和平台的值为null且未定义

我已经尝试过这个解决方案,但它不起作用

 function iterater(obj){
  let blankValues = [];
  Object.keys(obj).map((key) => {
      if (obj.hasOwnProperty(key) && (typeof obj[key] === "object")) {
        iterater(obj[key])
      } else {
          if (typeof obj[key] === "undefined" || obj[key] === ''){
            blankValues.push(key);
         }
      }
    })
  return blankValues;

}

但是这只返回['platform'],但是预期的输出应该是['platform','a1'],我认为在运行迭代器(obj[key])时,数组的值(blankValues)变为空,因为它不能保持它,但是请帮助我使用适当的逻辑和结构

共有3个答案

卫焕
2023-03-14

您需要使用递归调用的结果。例如,将其添加回blankValues如下blankValues.push(…迭代器(obj[key]))

const obj = {
  name:'ab',
  edu:'av',
  degres:{
    a1:'',
    b1:'1'
  },
  platform:undefined
 }

 function iterater(obj){
  let blankValues = [];
  Object.keys(obj).map((key) => {
      if (obj.hasOwnProperty(key) && (typeof obj[key] === "object")) {
        blankValues.push(...iterater(obj[key]))
      } else {
          if (typeof obj[key] === "undefined" || obj[key] === ''){
            blankValues.push(key);
         }
      }
    })
  return blankValues;

}

console.log(iterater(obj))
温亮
2023-03-14

正如您自己所说,当您调用迭代器(obj[key])时,它会设置一个新的本地blankValues,并将值放入其中。所以我认为你应该把blankValues放在函数之外。然后您就不必返回它(或者,如果您想将它作为返回值,也可以返回)。

或者您可以在主调用和内部调用中传递blankValue作为iterater参数

孙玺
2023-03-14

问题在于,在递归循环的每次迭代中,您都将blankValues定义为空数组。要解决这个问题,您可以接受数组作为函数的可选参数,以便在每次迭代时将值推送到它。

还要注意的是,正如@ziggy wiggy在评论中指出的,当遇到null值时,您的逻辑将失败,因为typeof obj[key]==“object”将是true。您还需要一个特定的空检查。

const obj = {
  name: 'ab',
  edu: 'av',
  degres: {
    a1: '',
    b1: '1'
  },
  platform: undefined,
  foo: null
}

function iterater(obj, arr) {
  arr = arr || [];
  Object.keys(obj).map((key) => {
    if (obj.hasOwnProperty(key) && (typeof obj[key] === "object") && obj[key] !== null) {
      iterater(obj[key], arr)
    } else {
      if (typeof obj[key] === "undefined" || obj[key] === null || obj[key].trim() === '') {
        arr.push(key);
      }
    }
  })
  return arr;
}

console.log(iterater(obj));
 类似资料:
  • 构建一个小的react应用程序,将地理位置(由浏览器确定为道具)传递给子组件。 第一个组件:app.jsx 该组件确定位置,保存要声明的纬度和经度,并通过props将该信息传递给Weather.jsx组件,该组件正在工作,如下图所示: 在Weather.jsx组件中,我尝试访问这些道具,得到未定义的或空的对象。 真的不知道问题是什么,因为react dev tools显示weather组件确实在传

  • 这是因为一些只兼容客户端的脚本被打包进了服务端的执行脚本中去。 对于只适合在客户端运行的脚本,需要通过使用 process.client 变量来判断导入。 举个例子, 在你的 .vue 文件中: if (process.client) { require('external_library') }

  • 问题内容: 我们正在尝试在Elasticsearch中找到不同的内部对象。这将是我们案例的最小示例。我们一直坚持下面的映射(更改类型或索引或添加新字段不会有问题,但结构应保持原样): 假设我们有以下示例数据: 当查询街道“贝克街”(以及所需的任何其他选项)时,我们希望获得以下列表: 格式并不重要,但是我们应该能够解析名字和姓氏。只是,由于我们的实际数据集要大得多,因此我们需要使输入项不同。 我们正

  • 问题内容: 我有以下代码。我想掌握用来创建内部类对象的外部类对象。我该怎么做? 编辑:好,你们中的一些人建议通过添加方法来修改内部类: 但是,如果我没有控制权来修改内部类,那(只是确认一下),我们还有其他方法可以从内部类对象中获取相应的外部类对象吗? 问题答案: 在内部类本身中,你可以使用。该表达式允许引用任何词法包围的实例,在JLS中被描述为。 我认为没有办法从内部类的代码之外获取实例。当然,你

  • 我正在努力找出如何使用Java流从对象值等于x的自定义对象列表中收集自定义对象。 这没有编译,但我不认为我离得很远--有人能指出我在哪里出错吗?

  • 我实现了一个函数,希望返回保存在某个url下的对象。在下面的代码中,第一个“console.log(result);”从firebase位置返回正确的对象。第二个返回未定义。有人能解释一下为什么以及如何修复它吗?