如何检查Javascript对象的值是否为数组而不为空

时间:2019-05-09 09:12:05

标签: javascript arrays javascript-objects

在运行一些代码之前,我需要检查我从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上执行此操作吗?

谢谢:)

2 个答案:

答案 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。

Array.every MDN documentation

Object.keys MDN documentation

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
}