对于in和Object.keys-ES6

时间:2019-06-08 13:17:38

标签: javascript ecmascript-6

这两个函数返回的不是一样吗?因为在给我ForInStatement不允许语法限制,而Object.keys给我完全不同的结果。一旦返回false,为什么会再次循环?

我想检查对象中的任何元素是否为空或为空。一旦返回false,为什么仍在Object.keys中循环?在ForIn中,它返回false,并且一旦在对象中检测到空元素,循环就会停止。

对于In

checkEmpty = (obj) => {
    for (const key in obj) {
      if (obj[key] === null || obj[key] === '') {
        console.log('forIn', obj[key] === null || obj[key] === '');
        return false;
      }
    }
    return true;
}

Object.keys

checkEmpty = (obj) => {
    Object.keys(obj).forEach(key => {
          if (obj[key] === null || obj[key] === '') {
            console.log('forEach', obj[key] === null || obj[key] === '');
            return false;
          }
    });
    return true;
}

2 个答案:

答案 0 :(得分:1)

Array.forEach()的返回值将被忽略,并且您无法像在for...in中那样中断循环。您的案例可以在检查失败后使用Array.some()返回结果。

注释1 :每当支票返回true时,Array.some()将返回true。仅当所有支票都返回true时,Array.every()才会返回true

注释2 :如果至少有一个truenull值,则函数背后的想法似乎是返回'',但是您的代码会执行相反。您可以将函数的结果取反,以在有空项时获得false

注释3 Array.keys/values/entriesArray.forEach()for...in循环之间还有另一个区别。 for...in循环还将循环所有继承的可枚举属性,而Object.x()方法将仅迭代自己的可枚举属性。

// use object values, I use Object.entries to show the key in the console
const checkHasEmpty = obj => Object.entries(obj).some(([key, value]) => console.log(`key: ${key}`) || value === null || value === '')

console.log(checkHasEmpty({}))

console.log(checkHasEmpty({ a: 1, b: null, c: 3 }))

console.log(checkHasEmpty({ a: '', b: 2 }))

console.log(checkHasEmpty({ a: 1, b: 2, c: null }))

答案 1 :(得分:0)

在第二个片段中,错误似乎在这里

Object.keys(obj).forEach(key => {
          if (obj[key] === null || obj[key] === '') {

forEach将参数接受为(item,index),其中item是数组的元素,index是数组中的当前索引。

因此obj[key]将尝试获取由键指定的数组中的元素,该键也可以是未定义的

尝试仅用obj[key]key替换obj[index]

Object.keys(obj).forEach(key => {
          if (key === null || key === '') {
相关问题