Есть ли способ создать массив с помощью jQuery / JS, который содержит все уникальные значения из таблицы, то есть без дубликатов? Кроме того, значения, которые меня будут интересовать, находятся только в TD с определенным классом (myClass) + я хотел бы исключить "" и "" как недопустимые значения.

В приведенном ниже примере выходные данные должны быть [item1,item2,item3] как единственные уникальные и допустимые значения.

Пример таблицы:

<table id="myTable">
    <thead>
        <tr>
            <th class="myHeader">Cat 1</th>
            <th>Vol 1</th>
            <th class="myHeader">Cat 2</th>
            <th>Vol 2</th>
            <th class="myHeader">Cat 3</th>
            <th>Vol 3</th>
            //...
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="myClass">item1</td><td>8</td><td class="myClass">item2</td><td>7</td><td class="myClass">item1</td><td>2</td>
        </tr>
        <tr>
            <td class="myClass">item3</td><td>5</td><td class="myClass">item2</td><td>7</td><td class="myClass">item2</td><td>4</td>
        </tr>
        <tr>
            <td class="myClass">item3</td><td>1</td><td class="myClass">item1</td><td>5</td><td class="myClass">item3</td><td>3</td>
        </tr>
        //...
    </tbody>
</table>

Мой JS на данный момент (без дублирования):

var result = new Array();
$('td').each(function() {
    if( ($(this).text() != '') && ($(this).text() != ' ') {
        result.push(+($(this).text()));
    }
});
alert(result);

Большое спасибо заранее, Тим.

1
user2571510 6 Апр 2014 в 19:41
1
Для этого хорошо подходят объекты, поскольку они могут содержать только уникальные ключи.
 – 
Joel Cornett
6 Апр 2014 в 19:44
Спасибо. Можете ли вы объяснить, что я должен изменить здесь? Я новичок в JavaScript.
 – 
user2571510
6 Апр 2014 в 19:46
1
См. этот ответ, чтобы удалить повторяющиеся значения из массива.
 – 
Matt
6 Апр 2014 в 19:47
Спасибо, Мэтт. Решение фильтра в вашей ссылке выглядит великолепно. Вы знаете, поддерживается ли это также в IE8?
 – 
user2571510
6 Апр 2014 в 19:53

3 ответа

Лучший ответ

Попробуй это

var result = new Array();
$('td').each(function() {
    if( ($(this).text() != '') && ($(this).text() != ' ') {
        if(result.indexOf($(this).text()) == -1){
            result.push(+($(this).text()));
        }
    }
});
alert(result);
2
smistry 6 Апр 2014 в 19:46
Спасибо и за это!
 – 
user2571510
6 Апр 2014 в 19:52
Думаю, я выберу этот, так как он работает во всех браузерах. Если бы я хотел рассмотреть только TD с определенным классом, я бы просто сказал $('td.myClass')... ?
 – 
user2571510
6 Апр 2014 в 19:57
Спасибо. Использование td.myClass возвращает только NaN для всех значений.
 – 
user2571510
6 Апр 2014 в 20:08
Хорошо, я получил это, чтобы работать. Мне пришлось изменить строку result.push следующим образом: result.push( $(this).text() );
 – 
user2571510
6 Апр 2014 в 20:20

Вы можете использовать $.unique() после:

result = $.unique(result);

Или уточняйте заранее:

if(result.indexOf(this.textContent) == -1){
    //push
}
2
Wilmer 6 Апр 2014 в 20:06
Спасибо за это. Поддерживается ли $.unique в IE8 и IE9?
 – 
user2571510
6 Апр 2014 в 20:07
1
Да, если вы используете jquery 1.x, не могу гарантировать, что начиная с версии 2.x не тестировалось.
 – 
Wilmer
6 Апр 2014 в 20:10
Спасибо. Я тестировал это, но в моем случае дубликаты не удаляются.
 – 
user2571510
6 Апр 2014 в 20:19
Странно, вы сделали это после каждого()?
 – 
Wilmer
6 Апр 2014 в 20:31

Ты можешь это сделать:

var result = new Array();

$('#myTable').find('td.myClass').each(function () {
   if (result.indexOf($(this).text()) == -1) {
       result.push($.trim($(this).text()));
   }
});
console.log(result);

Скрипка


С $.inArray():

var result = [];

$('#myTable').find('td.myClass').each(function () {
   if ($.inArray($(this).text(), result) == -1) {
      result.push($.trim($(this).text()));
   }
});
console.log(result);

С jQuery.inArray ()

0
Jai 6 Апр 2014 в 20:11