检查一个JSON数组是否为空

8

我知道一开始看起来这似乎是重复的问题,但我不认为它是...

我收到的是一个JSON数组:

var test1 = [] ;

或者

var test2 = [{},{},{}] ;  //This is empty

我可以轻松判断test1是否为空。

jQuery.isEmptyObject(test1)

我的问题与test2有关...请注意,在某些情况下,test2可能会返回类似以下内容:
var test2 = [{"a":1},{},{}] ;  //All these are not empty
var test2 = [{},{"a":1},{}] ;  //All these are not empty
var test2 = [{},{},{"a":1}] ;  //All these are not empty

上述情况不应被视为为空。我尝试使用.length,但它没有帮助,因为长度始终为3...有任何想法吗?
干杯。

你是说只有当数组为空或数组仅包含没有键的对象时,它才应该返回true吗? - Evan Trimboli
为什么不直接使用这个if语句:test2[0].length===0&&test[1].length===0&&test[2].length===0,我知道它很简陋,但无论如何。 - markasoftware
1
length 不是对象上的有效属性。 - Evan Trimboli
+1 Evan,如果你对一个对象使用.length,你只会得到一个未定义的错误。@Evan Trimboli,我只需要捕获test2是[{},{},{}]的情况。 - Thanos
8个回答

7
function isArrayEmpty(array) {
    return array.filter(function(el) {
        return !jQuery.isEmptyObject(el);
    }).length === 0;
}

jsFiddle演示

通过了所有测试。

一个纯JavaScript的解决方案是将!jQuery.isEmptyObject(el)替换为Object.keys(el).length !== 0

编辑:使用Array.prototype.every

function isArrayEmpty(array) {
    return array.every(function(el) {
        return jQuery.isEmptyObject(el);
    });
}

3

对于需要非jQuery解决方案的用户:

var test2 = [{a: 1},{},{}] ;  //This is empty

function isEmpty(val) {
    var len = val.length,
        i;

    if (len > 0) {
        for (i = 0; i < len; ++i) {
            if (!emptyObject(val[i])) {
                return false;
            }
        }
    }
    return true;
}

function emptyObject(o) {
    for (var key in o) {
        if (o.hasOwnProperty(key)) {
            return false;
        }
    }
    return true;
}

console.log(isEmpty(test2));

2
没有使用 JQuery:使用 Array.filter1Object.keys2
function JSONEmpty(obj){
    return !obj.length || 
           !obj.filter(function(a){return Object.keys(a).length;}).length;
}
// usage
JSONEmpty([{"a":1},{},{}]);  //=> false
JSONEmpty([{},{"a":1},{}]);  //=> false
JSONEmpty([{},{},{"a":1}]);  //=> false
JSONEmpty([]);               //=> true
JSONEmpty([{},{},{}]);       //=> true

更新2018:箭头函数现在被所有现代浏览器支持,所以像himel-nag-rana所述,你也可以使用它们:
const JSONEmpty = obj => !obj.length || !obj.filter(a => Object.keys(a).length).length;

1. 更多信息 2. 更多信息(链接包含旧版浏览器的支架)

值得注意的是 Object.keysArray.filter 的浏览器兼容性。 - Evan Trimboli
一个更短的箭头函数版本是:isJSONArrayEmpty(obj) { return !obj.length || !obj.filter(a => Object.keys(a).length).length; } - Himel Nag Rana
1
@HimelNagRana 我非常确定在2013年8月时,大多数浏览器还没有完全或部分实现箭头函数。 - KooiInc
@KooiInc,当然,这是后来才出现的。但我加入这个点只是为了完善解决方案,以便2018年的开发人员能够获得更简短/更新的版本。没有别的意思。 :-) - Himel Nag Rana

1

我曾经遇到过同样的问题,而我找到了这个不需要使用jQuery的解决方案:

function isEmpty(x) {
   for(var i in x) {
       return false;
   }
   return true;
}

0

非常简单...

if(jQuery.isEmptyObject(test2[0]) && jQuery.isEmptyObject(test2[1]) && jQuery.isEmptyObject(test2[2])))
    // do something

1
如果数组有4个元素会怎样? - Evan Trimboli
是的,我很懒,但你可以很容易地在循环中实现这个。 - Ch33f

0

也许你可以尝试使用类似的函数

function isEmptyObject (test) {
    for (var i in test) {
        if (!jQuery.isEmptyObject(test[i])
            return false;
    }
    return true;
}

0
这是我的看法:将数组转换为集合并检查大小。
var myArray = [1,2,3];
var mySet = new Set(myArray);
console.log(mySet.size === 0);

-1

通过循环数组中的每个值进行检查并返回错误 尝试

for(i=0;js_array[i]!=null;i++)
{
  if(js_array[i]=="")
  { 
    alert("Empty");
  }
}

这将始终返回false,因为该条件使用了一个赋值给falsey值的操作。 - Evan Trimboli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接