DataTables search filter handler I am writing a JavaScript feature where by I need to make a call to a third-party library (pre-1.10 DataTables) depending upon whether or not the user provides an integer as an input to the function during initialization. I am pasting here the snippet. As you can see it has duplicate code in the if/else clauses, the only difference is the method signature for *.fnFilter. 

How can I optimize this code further? Also I dont want to test the condition during each key-up.

/*
 * By default this is a global search box events. Global being searchable across all columns.
 * But if an int is provided as an input then it will apply the search only on that column.
 * */
_bindSearchEvents: function(onColumnIndex) {

    var self = this;

    if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
        self.settings.search.input.live('keyup', function() {
            self.widget.fnFilter($(this).val(), onColumnIndex);
        });

        self.settings.search.reset.live('click', function() {
            self.settings.search.input.val("");
            self.widget.fnFilter("", onColumnIndex);
        });

    } else {

        self.settings.search.input.live('keyup', function() {
            self.widget.fnFilter($(this).val());
        });

        self.settings.search.reset.live('click', function() {
            self.settings.search.input.val("");
            self.widget.fnFilter("");
        });
    }
},
Since all that is different about the two if/else bodies is the arguments to the fnFilter method, you can construct the difference in one if statement and then use that in one copy of the code rather than two.

/*
 * By default this is a global search box events. Global being searchable across all columns.
 * But if an int is provided as an input then it will apply the search only on that column.
 * */
_bindSearchEvents: function (onColumnIndex) {

    var self = this;
    var args = [];
    if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
        args.push(onColumnIndex);
    }
    self.settings.search.input.live('keyup', function () {
        var argsCopy = [].concat(args);           // make copy of args
        argsCopy.unshift($(this).val());      // push item onto front of args
        self.widget.fnFilter.apply(self.widget, argsCopy);
    });

    self.settings.search.reset.live('click', function () {
        self.settings.search.input.val("");
        var argsCopy = [].concat(args);
        argsCopy.unshift("");                 // push item onto front of args
        self.widget.fnFilter.apply(self.widget, argsCopy);
    });
},


If the fnFilter function is written to check to see if the second parameter is null (rather than checking the number of arguments passed), then this shorter version could work also, but we'd have to see what the fnFilter documentation says or how the fnFilter source code actually works to know if this shorter method would work:

/*
 * By default this is a global search box events. Global being searchable across all columns.
 * But if an int is provided as an input then it will apply the search only on that column.
 * */
_bindSearchEvents: function (onColumnIndex) {

    var self = this;
    var index = null;
    if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
        index = onColumnIndex;
    }
    self.settings.search.input.live('keyup', function () {
        self.widget.fnFilter($(this).val(), index);
    });

    self.settings.search.reset.live('click', function () {
        self.settings.search.input.val("");
        self.widget.fnFilter("", index);
    });
},