js如何优雅的判断一个对象中是否有属性为空?

例如,person对象

    let person = {
      name: "章三",
      age: 25,
      address: "",
    };

如何优雅的判断其中有属性为空,不要用for循环

阅读 10.9k
14 个回答

Object.values(person).includes('')
image.png

如果你想要判断所有属性当中是否有为空的,那么不管怎么样都还是得借助循环,不管是forforEach 还是 map 等等。

不过一般来说如果为空需要提醒用户填写的话,最好不要单独写一个函数去跑循环:

function submitData(form){
    const keysList = Object.keys(form)
    for(let key of keysList) {
        if(!form[key]) return alert(`${key} is empty!`) 
    }
    ....
}

一般来说都是借助的UI库提供的表单校验方法,或者引入 async-validator 这个异步校验库来处理。来提醒用户去完成内容填写。

let isSomeEmpty = Object.values(person).some(v => v === '')
console.log(isSomeEmpty)

要想找出某个“值”符合条件的项,那一定是需要遍历的,遍历就只有两种方法:

  1. 循环(代码级别的循环)
  2. 递归(机器指令级别的循环,可能是通过跳转来实现)

如果不用 for 循环,那可以用 white,也可以使用一些底层使用循环来实现的工具方法,比如

let person = {
    name: "章三",
    age: 25,
    address: "",
};

var hasEmptyValue = Object.entries(person)
    .some(([, v]) => v === undefined || v === null || v === "");

console.log(hasEmptyValue);

这可能还没有一个 for...of 循环效率高,但确实没用 for 循环。for 循环只需要进行一个不完全遍历就可以得到结果,上面的代码进行了一次完全遍历 (entries()),和一次不完全遍历(some())。

const isObjcetEmpty = (obj: {[key: string]: any}) => Reflect.ownKeys(obj).length === 0 && obj.constructor === Object

export default isObjcetEmpty
Object.keys(person).length === Object.values(person).filter(v => v).length

比较keys和values即可

// Not recommended !!!😂
/(?<!\\)""/g.test(JSON.stringify({
      name: "章三",
      age: 25,
      address: "",
    }))
新手上路,请多包涵

Object.entries(person).flat().indexOf('')>-1
这样写会不会被打啊?

无所谓,递归会出手

const obj = {
    name: '1',
    age: '12',
    bar: ''
}

function hasEmpty(target, checkkeys) {
    if (!checkkeys.length) return false;
    if (target[checkkeys.pop()] === '') return true;
    return hasEmpty(target, checkkeys)
}

hasEmpty(obj, Object.keys(obj))

Object.values(person).some(Boolean)

不明白为什么不能有循环,难道属性很多?

const obj = {a: 0, b: '', c: "", d: null, e: undefined};
objStr = JSON.stringify(obj);
if (objStr.indexOf('""') >= 0 || objStr.indexOf('null') >= 0) {
    console.log('存在空的属性')
}

lodash

新手上路,请多包涵

Object.values(person).some(v => (v+'').trim() == '')

_.isEqual(o, _.pickBy(o, v => v!==''))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题