2013-12-23 3 views
3

У меня есть таблица, где я извлекаю данные и добавляю их в массив массивов. Проблемы в том, что если одна из ячеек таблицы пуста, она появляется в массиве как «неопределенная». Я попытался использовать if, если последний элемент не определен, если так использовать .pop(), элемент должен быть удален. Я все еще получаю неопределенные элементы. Вот мой код и жить demoУдалить undefined элементы из массива

HTML:

<table id="contactlisttable"> 
    <tr> 
     <th>Name</th> 
     <th>Title</th> 
     <th>Phone</th> 
    </tr> 
    <tr> 
     <td class="contactlist contactlistlastfirst">Joey</td> 
     <td class="contactlist contactlisttitle">webdesigner</td> 
     <td class="contactlist contactlistphone"></td> 
    </tr> 
    <tr> 
     <td class="contactlist contactlistlastfirst">Anthony</td> 
     <td class="contactlist contactlisttitle">webdesigner</td> 
     <td class="contactlist contactlistphone">5555555</td> 
    </tr> 
</table> 


JavaScript:

//IE9+ compatable solution 
$(function(){ 
    var results = [], row; 
    $('#contactlisttable').find('th, td').each(function(){ 
     if(!this.previousElementSibling){ //New Row? 
      row = []; 
      results.push(row); 
      if($(this) === 'undefined'){//Remove undefined elements 
       row.pop(); 
      } 
     } 
     row.push(this.textContent || this.innerText); //Add the values (textContent is standard while innerText is not)  
    }); 
    console.log(results); 
}); 

+0

Что бы вы хотели поехать в массиве поле не определено? – Jivings

+0

Это также устранит «разреженный» аспект массива. Почему бы просто не использовать объект в этот момент? –

ответ

2

jsFiddle Demo

Вместо того, чтобы делать условные операторы, просто воспользоваться вашей HTML структуры. Сначала выберите по строкам таблицы, а затем переведите дочерний элемент td или th. Вы также можете использовать jQuery's text вместо того, чтобы выполнять обнаружение функции. Текст jQuery будет более надежным.

var results = []; 
$('#contactlisttable tr').each(function(){ 
var row = []; 
$(this).find('td,th').each(function(){ 
    row.push($(this).text()); 
}); 
results.push(row); 
}); 
console.log(results); 
+0

+1 Внутренняя петля имеет больше смысла. Может использовать '.map() 'для создания массивов, хотя вам нужно будет обойти автоматическое выравнивание jQuery для внутреннего' .map() '. –

0

Чтобы знать, если что-то не определено как раз не сравнить с "undefined", использование TYPEOF().

Так что вы хотите сделать:

if (typeof(this) === "undefined") 
+2

Это никогда не будет правдой, потому что вы создаете объект jQuery. Объект никогда не будет возвращать неопределенный тип. Я не уменьшал ни одного слова, просто указывая на это. –

+0

Действительно, только когда слишком быстро. Исправленный. – EoiFirst

+0

'typeof' не является функцией. Вы не любите парнеров. – canon

1

Вместо того, чтобы нажимать и выскакивают, если он не соответствует, не давите на первом месте.

Обновление с вашего jsfiddle:

//IE9+ compatable solution 
$(function(){ 
    var results = [], row; 
    $('#contactlisttable').find('th, td').each(function(){ 
     if(!this.previousElementSibling && typeof(this) != 'undefined'){ //New Row? 
      row = []; 
      results.push(row); 
     } 
     row.push(this.textContent || this.innerText); //Add the values (textContent is standard while innerText is not)  
    }); 
    console.log(results); 
}); 
0

Вы можете добавить компактный метод, как в подчеркиванием и lodash ...

Array.prototype.compact = function() { 
    return this.filter(function(x){ 
     return x !== undefined; 
    }); 
} 

console.log([1,2, '', undefined, 'e', undefined].compact()); // [ 1, 2, '', 'e' ] 

Вы, вероятно, следует добавить проверку на родной реализации compact как ну, так как вы переопределяете собственный прототип с этим.

Или просто

+0

Зачем ставить 'compact()' на 'Function.prototype', если он предназначен только для работы с массивами? –

+0

Мое плохое, раннее утро: P ... Обновлено. – brbcoding

1

Вы также можете избежать добавления Неопределенные (или фактически пустые) элементы таким образом:

$('#contactlisttable').find('th, td').each(function(){ 
    if(!this.previousElementSibling){ //New Row? 
     row = []; 
     results.push(row); 
    } 
    if(!(this.textContent == '')){ 
     row.push(this.textContent || this.innerText);    
    } 
}); 
+0

Ответы Тревиса J гораздо более подходят для этого случая. – Julio

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