1

我有一个数组数组,我试图从中提取值。问题是当它碰到一个空数组时我得到一个未定义的错误。

这是我正在使用的数组:

 data = [[Object { myvar=null}], [Object { myvar="testval"}], [], [], []]

这是我用来获取所有 myvar 值的 javascript:

myarr = [];
for (var i = 0; i < data.length; i++) {
    console.log(data[i][0].myvar);
    if (data[i][0].myvar) {
        dep = data[i][0].myvar;
        if (dep != null) {
            myarr.push(dep);
        }
    }
}

console.log 看起来像:

   null
   testval
   Error: data[i][0] is undefined

所以当它到达第一个 [] 时它会中断。如何在 for 循环之前删除所有空数组?或者当 for 循环碰到一个空数组时它不会死掉?任何帮助表示赞赏。谢谢。

4

6 回答 6

3

您可以简单地检查当前项目是否为空:

if (data[i].length === 0) continue;
于 2013-08-29T13:32:38.340 回答
0

只是想将此添加为答案。我相信在 javascript 中null == false。所以你也可以这样做:

if(data[i][0])
   //it's not null or undefined, do some work
于 2013-08-29T13:40:32.283 回答
0

您需要确保 data[i] 是一个数组,并且它首先至少有一项:

var i, item, myarr = [],
    isNotEmptyArray = function(a) {
        return Object.prototype.toString.call(a) === '[object Array]' && a.length > 0;
    };

for (i = 0; i < data.length; i++) {
    item = data[i];
    if (isNotEmptyArray(item) && item[0].myvar) {
        console.log(item[0].myvar);
        dep = item[0].myvar;
        if (dep != null) {
            myarr.push(dep);
        }
    }
}
于 2013-08-29T13:43:44.847 回答
0
for (var i = 0; i < data.length; i++) {
    if (data[i].length !== 0) continue;
    if (data[i][0].myvar) {
        dep = data[i][0].myvar;
        if (dep != null) {
            myarr.push(dep);
        }
    }
}
于 2013-08-29T13:44:31.613 回答
0

这是最好和最干净的方法。

data.forEach(function(e){
    if(Object.keys(e).length) myarr.push(e);
});

看看 http://jsfiddle.net/8zfZd/打开控制台查看对象。

对象.keys()

为每个

让它更短...

data.forEach(function(e){ (e[0]) && myarr.push(e); });

http://jsfiddle.net/cgg6j/

于 2013-08-29T13:46:20.860 回答
-1

在循环之前添加此循环以清除空数组:

var i = 0;
while (true) {
    if (i == data.length)
        break;
    if (data[i].length == 0)
        data.splice(i, 1);
    else
        ++i;
}
于 2013-08-29T13:37:36.817 回答