javascript - 在嵌套对象中查找任何错误值的更好的 vanilla JS 方法?

标签 javascript

如果我有一个对象,例如:

const obj = {
  field1: {
    subfield1: true,
    subfield2: true,
  },
  field2: {
    subfield3: true,
  },
  field3: {
    subfield4: false,
    subfield5: true,
  }
}
然后,如果值为 false,我可以执行嵌套 for 循环以返回 true通过做,
const findFalse = obj => {
  for (const field in obj) {
    for (const subfield in obj[field]) {
      if (!obj[field][subfield]) return true
    }
  }
}
如果这个对象没有嵌套,它会更容易一些,我可以做类似的事情,
const findFalse = obj => Object.keys(obj).some(prop => !obj[prop]);
这两种方法都不适合我的需要,因为对象可以有 2、3 或更多嵌套属性。我想出了一种递归方法来解决这个问题,例如:
const isObj = obj => obj && obj.constructor === Object;

const findFalseRecursively = obj => {
  for (const field in obj) {
    if (isObj(obj[field]))
      return findFalseRecursively(obj[field])

    if (obj[field] === false)
      return true
  }
}
但我想知道是否有更清洁或更有效的方法来实现这一目标?
我希望该函数返回第一个 false它看到的值,并立即跳出函数/for循环。

最佳答案

您可以从对象中获取值并通过短路进行迭代。

const 
    hasTrue = object => Object
        .values(object)
        .some(v => v === false || v && typeof v === 'object' && hasTrue(v)),
    object = { field1: { subfield1: true, subfield2: true }, field2: { subfield3: true }, field3: { subfield4: false, subfield5: true } };

console.log(hasTrue(object));

预先建议检查对象

const 
    hasTrue = value => value === true || !!value && typeof value === 'object' && Object
        .values(value)
        .some(hasTrue),
    object = { field1: { subfield1: true, subfield2: true }, field2: { subfield3: true }, field3: { subfield4: false, subfield5: true } };

console.log(hasTrue(object));

关于javascript - 在嵌套对象中查找任何错误值的更好的 vanilla JS 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030874/

相关文章:

javascript - 页面和帖子上的 Wordpress 侧边栏定位

javascript - 有没有办法让 child 从 jquery 中的某个索引到某个索引

javascript - 如何在 JavaScript 中使用正则表达式替换字符串

javascript - CSS 不适用于 rzslider

javascript - 如何在reactjs中选择默认复选框

javascript - 如何使用 css 制作自动调整水平线 DIV 大小?

javascript - 保存 jasmine Expect() 结果

javascript - 使用 SweetAlert 和 Ajax 删除

javascript - 无法将函数导入 Vue.js 单文件组件

javascript - 路由更改时 Mithril 组件不更新