在运行一些代码之前,我需要检查我从JSON文件传递的数据是否正确。
具体地说,我正在尝试检查电子邮件是否存在以及我的 body 对象: -至少有一把钥匙 -每个键都有一个值 -并且该值必须是一个至少包含一项的数组。
const email = "john@gmail.com"
const body = {
"fruit": ["apple"],
"vegetables": ["carrot", "beans"]
}
这是到目前为止我尝试过的事情:
if (email && Object.keys(body).length > 0 && Object.keys(body) instanceof Array) {
// run some code
} else {
// log error
}
instanceof 是这里的最佳方法吗?我想知道是否应该使用.isArray()。我还应该在Object.keys或Object.value上执行此操作吗?
谢谢:)
答案 0 :(得分:2)
一种选择是检查Object.values
中的body
,并查看其中的.every
是否是长度为非零的数组:
const email = "john@gmail.com"
const body = {
"fruit": ["apple"],
"vegetables": ["carrot", "beans"]
}
const ok = email && Object.values(body).every(val => Array.isArray(val) && val.length !== 0);
if (ok) {
console.log('ok');
} else {
// handle error
}
问题
Object.keys(body) instanceof Array
如果true
是一个对象,这将总是 返回body
:
const email = "john@gmail.com"
const body = { foo: 'bar' }
console.log(Object.keys(body) instanceof Array);
答案 1 :(得分:1)
您可能要使用Object.keys
并检查每个值是一个数组并且至少具有一个值。
Object.keys(body).every(key => Array.isArray(body[key]) && body[key].length !== 0)
这将为每个主体键检查其值是一个数组(使用Array.isArray
),并且其中至少有一个元素(使用body[key].length
)。
此外,.every
仅在所有测试均通过时返回true。
const email = "john@gmail.com"
const body = {
"fruit": ["apple"],
"vegetables": ["carrot", "beans"]
}
if (email && Object.keys(body).length > 0 && Object.keys(body).every(key => Array.isArray(body[key]) && body[key].length !== 0)) {
console.log('hooray!');
} else {
// log error
}