Таблица фильтра от <избранного> входа с помощью jQuery

Монада является типом данных, который начинает две операции: >>= (иначе bind) и return (иначе unit). return принимает произвольное значение и создает экземпляр монады с ним. >>= берет экземпляр монады и отображает функцию по нему. (Вы уже видите, что монада является странным видом типа данных, с тех пор на большинстве языков программирования Вы не могли записать функцию, которая принимает произвольное значение и создает тип из него. Монады используют своего рода параметрический полиморфизм .)

В нотации Haskell, интерфейс монады записан

class Monad m where
  return :: a -> m a
  (>>=) :: forall a b . m a -> (a -> m b) -> m b

, Эти операции, как предполагается, подчиняются определенным "законам", но это не ужасно важно: "законы" просто шифруют способ, которым должны вести себя разумные реализации операций (в основном, это >>= и return должно согласиться о том, как значения преобразовываются в экземпляры монады и что >>= ассоциативно).

Монады не являются примерно состоянием и вводом-выводом: они абстрагируют общий шаблон вычисления, которое включает работу с состоянием, вводом-выводом, исключениями и недетерминизмом. Вероятно, самые простые монады для понимания являются типами опции и списками:

instance Monad [ ] where
    []     >>= k = []
    (x:xs) >>= k = k x ++ (xs >>= k)
    return x     = [x]

instance Monad Maybe where
    Just x  >>= k = k x
    Nothing >>= k = Nothing
    return x      = Just x

то, где [] и : конструкторы списка, ++, является оператором конкатенации, и Just, и Nothing эти Maybe конструкторы. Обе из этих монад инкапсулируют общие и полезные шаблоны вычисления на их соответствующих типах данных (обратите внимание, что ни один не имеет никакого отношения к побочным эффектам или вводу-выводу).

действительно необходимо играть вокруг записи некоторого нетривиального кода Haskell для понимания то, о чем монады и почему они полезны.

5
задан Brian Tompsett - 汤莱恩 29 September 2016 в 21:08
поделиться

5 ответов

Это будет работать, если у вас есть только один выбор и одна таблица, построенная как в вашем примере

$(document).ready(function($) {
    var rows = $('table tr').each(function() {
        var row = $(this);
        var columns = row.children('td');

        row.data('name-chars', [
            columns.eq(0).html()[0].toUpperCase(),
            columns.eq(1).html()[0].toUpperCase(),
        ]);
    });

    $('select').change(function() {
        var char = $(this).val().toUpperCase();

        rows.each(function() {
            var row = $(this);
            var chars_to_match = row.data('name-chars');
            if($.inArray(char, chars_to_match) > -1) {
                row.show();
            }
            else {
                row.hide();
            }
        });
    });
});
6
ответ дан 14 December 2019 в 04:45
поделиться

Я придумал это. Очень похоже на то, что придумал Эльзо, но он ограничивает его первыми двумя столбцами таблицы.

 $('select').change( function(e) { 
   var letter = $(this).val();
     if (letter === 'ALL') {
         $ ('tr').show ();
     }
     else {
         $('tr').each( function(rowIdx,tr) {
             $(this).hide().find('td').each( function(idx, td) {
                 if( idx === 0 || idx === 1) {
                     var check = $(this).text();
                     if (check && check.indexOf(letter) == 0) {
                         $(tr).show();
                     }
                 }
             });             

         });
     }             
 });

Он не игнорирует регистр и предполагает, что у вас есть один выбор, а на странице только те, которые вы хотите отфильтровать .

РЕДАКТИРОВАТЬ Добавлен параметр «ВСЕ», чтобы снова отображать строки.

2
ответ дан 14 December 2019 в 04:45
поделиться

Если идентификатор вашей таблицы - sel , а таблица - tab , это поможет. Измените eq (0) , чтобы изменить столбец для поиска. Пустое значение в поле выбора повторно отобразит все trs.

var selSelection = $("#sel").val();
if(!selSelection) $("#tab tr").show();
else $("#tab tr").show().filter(function(index){
    return $("td:eq(0)", this).html().indexOf(selSelection) == -1;
}).hide();
0
ответ дан 14 December 2019 в 04:45
поделиться

Изменить: Я только что заметил, что enumerable - это IQueryable , но selectFunc и whereFunc относятся к типу Func . Это приведет к вызову Enumerable версий OrderBy и Where вместо использования вызовов базы данных. Вероятно, вы захотите вместо этого переключить их на Expression > .

Если вы не хотите сначала заказывать regNums , вот O (n) Решение в стиле гольфа:

var max = regNums.Max(i => (int?)i) ?? 0;
return Enumerable.Range(1, max + 1)
                 .Except(regNums)
                 .Min();

По строке:

  1. При приведении к int? , Макс вернет null , если regNums пусто, объединено с 0 .

  2. Создайте последовательность из всех возможных регистров,

0
ответ дан 14 December 2019 в 04:45
поделиться

Попробуйте это. При необходимости замените y на $ (y).

$('tr').hide();
$('select').change( function(){
    var letter = $(this).val();
    var dataset = $('#tableID').find('td');
    $.each(dataset, function(x, y){
        if( y.substr(0,1) == letter){
            y.parent().show();
        }
    });
});

Edit

@SolutionYogi. Ты прав. Думаю, эту строку можно переписать так:

var dataset = $('#tableID').find('tr').children('td').slice(0,1);

Впрочем, никогда не пробовал.

РЕДАКТИРОВАТЬ 2

Я это тестировал. Надеюсь, он также достаточно элегантен и у меня больше нет ошибок.

$('tr').hide();
$('select').change( function(){
    var letter = $(this).val();
    var dataset = $('#tableID').find('tr');
        $.each(dataset, function(x, y){
            var data = $(y).children().slice(0,2);
                $.each(data, function(a, b){
                    if( $(b).html().substr(0,2) == letter){
                        $(b).parent().show();
                    }
             });
       });
});
0
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: