2013-08-29 7 views
1

У меня есть массив массивов, из которых я пытаюсь извлечь значения. Проблема в том, что я получаю неопределенную ошибку, когда она попадает в пустой массив.Работа с пустыми объектами в массиве javascript

Вот массив я работаю с:

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

Вот Javascript я использую, чтобы получить все значения MYVAR:

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 не умирает, когда он попадает в пустой массив? Любая помощь оценивается. Благодарю.

+0

Можете ли вы показать код, который положил туда пустой массив? –

+0

Третий элемент массива 'data' - пустой массив. Поэтому, когда вы достигнете 'i = 2' (который является третьим элементом),' data [i] 'пуст. Таким образом, нет данных 'data [i] [0] – matewka

+0

, чтобы проверить мой ответ, он даже проверяет наличие пустых объектов и массивов, будучи коротким –

ответ

3

Вы можете просто проверить, пуст ли текущий элемент:

if (data[i].length === 0) continue; 
+0

Вот и все ... В этом случае это было! == 0. Спасибо. – suncoastkid

-1

Добавьте этот цикл до вашего цикла, чтобы очистить пустые массивы:

var i = 0; 
while (true) { 
    if (i == data.length) 
     break; 
    if (data[i].length == 0) 
     data.splice(i, 1); 
    else 
     ++i; 
} 
+0

Почему цикл дважды? Вы можете проверить 'if (data [i] .length == 0)' внутри того же цикла – matewka

+0

@matewka OP специально попросил убрать пустые объекты перед циклом for. Код, который я поставил, проверен и исправлен. – fred02138

+0

Хотя он спросил, это не значит, что это правильно. Я думаю, вы могли бы предложить лучший ответ, чем просто выполнение запроса OP. – matewka

0

Просто хотел бы добавить это как ответ. В javascript, я считаю, null == false. Таким образом, вы можете сделать что-то вроде этого:

if(data[i][0]) 
    //it's not null or undefined, do some work 
0

Вы должны убедиться, что данные [я] является массивом, и имеет, по меньшей мере, 1 пункт первый:

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); 
     } 
    } 
} 
+0

Зачем создавать такой монстр, когда вы можете получить тот же результат с помощью data.forEach (function (e) {(e [0]) && myarr.push (e);}); ' –

+0

Не все браузеры поддерживают для каждого (ну, в основном, IE), я просто исправлял его код. – OneOfOne

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); 
     } 
    } 
} 
0

Это лучший и самый чистый способ сделать это.

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

гляньтеhttp://jsfiddle.net/8zfZd/ откройте консоль, чтобы увидеть объект.

Object.keys()

forEach

, чтобы сделать его еще короче ...

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

http://jsfiddle.net/cgg6j/

Смежные вопросы