✏️ 这个单行代码检查对象数组的任何对象内是否存在虚假值:
const hasFalsyValue = (list) =>
!list.every(obj => Object.values(obj).every(prop => prop))
我发现这对于防止 null / falsy 值被进一步传递很有用:
const listA = [ { a:'?', b:100 }, { a:'?', b:200 } ]
const listB = [ { a:null, b:100 }, { a:'?', b:200 } ]
// hasFalsyValue(listA) === false
// hasFalsyValue(listB) === true
只有一个细节我们应该注意:
⚠️ 在 Javascript 中 0 和 '' 是 Falsy 值! ⚠️
因此,如果 hasFalsyValue() 在数组中的对象内找到任何零值或任何空字符串值,它将认为它是假值并因此返回 true!
...虽然这可能是您想要的,但有时您可能希望允许将任何特定的 Falsy 值视为 Truthy。
✍? 假设您想在您的对象中允许零值,您可以执行以下操作:
const hasFalsyValue_ZeroAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === 0))
现在零值不再被认为是虚假的:
const listC = [ { a:0, b:100 }, { a:'?', b:200 } ]
const listD = [ { a: null, b:100 }, { a:'?', b:200 } ]
hasFalsyValue_ZeroAllowed(listC) // false
hasFalsyValue_ZeroAllowed(listD) // true
您可以继续向函数添加更多条件以进行定制验证:
✍? 允许空值:
const hasFalsyValue_NullAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === null))
const listE = [ { a: null, b:100 }, { a:'?', b:200 } ]
hasFalsyValue_NullAllowed(listE) // false
✍? 允许空字符串值:
const hasFalsyValue_EmptyStringAllowed =
(list) => !list.every(obj => Object.values(obj).every(prop => prop || prop === ''))
const listF = [ { a: '', b:100 }, { a:'?', b:200 } ]
hasFalsyValue_EmptyStringAllowed(listF) // false