这两个函数返回的不是一样吗?因为在给我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;
}
答案 0 :(得分:1)
Array.forEach()
的返回值将被忽略,并且您无法像在for...in
中那样中断循环。您的案例可以在检查失败后使用Array.some()
返回结果。
注释1 :每当支票返回true
时,Array.some()
将返回true
。仅当所有支票都返回true
时,Array.every()
才会返回true
。
注释2 :如果至少有一个true
或null
值,则函数背后的想法似乎是返回''
,但是您的代码会执行相反。您可以将函数的结果取反,以在有空项时获得false
。
注释3 :Array.keys/values/entries
与Array.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 === '') {