我有一个这样的对象:
{
places: [],
interests: [],
checkIns: []
}
如何轻松检查其中任何一个数组是否为空?
答案 0 :(得分:3)
如果您使用的是ES6:
Object.values(obj).every(x => !x.length)
仅当obj
的所有数组为空时才返回true。
示例:
var obj = {
places: [],
interests: [],
checkIns: []
}
console.log(Object.values(obj).every(x => !x.length));
var obj = {
places: [1],
interests: [],
checkIns: []
}
console.log(Object.values(obj).every(x => !x.length));
答案 1 :(得分:2)
如果属性确实是Object.entries
的实例,则可以使用Array.prototype.forEach
和Array
遍历对象的属性,并检查数组的长度。
var o = {
places: [],
interests: [],
checkIns: [],
someItems: [1, 2, 3, 4],
notArr: false
};
Object.entries(o).forEach(function(entry) {
let [key, value] = entry;
if (value instanceof Array) {
if (value.length === 0) {
console.log(`${key} is an empty array`);
} else {
console.log(`${key} is an array that contains items`);
}
} else {
console.log(`${key} is not an array`);
}
})
答案 2 :(得分:0)
答案 3 :(得分:-1)
如果您要检查提供的数组对象中数组的 ANY 是否为空,请考虑使用Array.some():
来自MDN的:
some()方法测试数组中的至少一个元素是否通过了由提供的函数实现的测试。
由于您的数组对象暂时还不是Array
,因此必须先将其转换为一个。在这种情况下,请使用Object.values(): 例如: let arrays = Object.values(objectOfArrays)
:
Object.values()方法返回给定对象自己的可枚举属性值的数组,其顺序与for ... in循环所提供的顺序相同(区别在于for-in循环枚举了in ...原型链)。
现在您拥有Array
:Arrays
中的let arrays = [[], [], []]
,则可以使用Array.some()
:
arrays.some(array => !array.length)
或:
arrays.some(function(array) {
return !array.length
})
请注意,仅指定array.length
就足够了,而不是完全均衡(array.length === 0
)。这是因为0
的javascript(Boolean
)签入中的if (condition) {...}
返回了false
。
如果数组中包含任何值,则array.length
应该比0
高一个数字,这意味着调用if (array.length) {...}
将返回true
PS:
调用Array.every()
是另一种方法。尽管注意Array.every()
遍历数组中的所有值,而Array.some()
满足条件后返回true,然后停止。