<!DOCTYPE html>
<html>
  <head>
    <link data-require="bootstrap-css@3.3.4" data-semver="3.3.4" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" />
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" />
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2-bootstrap.min.css" />
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
  <div class="container">
  <div class="page-header">
    <h1>select2 with pagination</h1>
    <p>for improved performance with large data sets (20 000 items)</p>
    </div>
        <select class="form-control" id="e24"></select>
    </div>
    <!--[if lt IE 9]>
     <script type="text/javascript" src='//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js'></script>
    <![endif]-->
    <!--[if gte IE 9]><!-->
    <script type="text/javascript" src='//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
    <!--<![endif]-->
    <script data-require="lodash-underscore@3.7.0" data-semver="3.7.0" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.7.0/lodash.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js"></script>
    <script src="script2.js"></script>
  </body>
</html>
// Function to shuffle the demo data 
var shuffle = function (str) {
    return str.split('').sort(function () {
      return 0.5 - Math.random();
    }).join('');
  };

// For demonstration purposes we first make
// a huge array of demo data (20 000 items)
// HEADS UP; for the _.map function i use underscore (actually lo-dash) here
var mockData = function () {
    var array = _.map(_.range(1, 20000), function (i) {
        return {
          id  : i,
          text: shuffle('te ststr ing to shuffle') + ' ' + i
        };
      });
    return array;
    console.log(array);
  };

$(function () {
  // create demo data
  var dummyData = mockData();
  // set initial value(s)
  $('#e24').val([
    dummyData[75].text, dummyData[1897].text
  ]);

  // init select 2
  $('#e24').select2({
    data             : dummyData,
    // init selected from elements value
    initSelection    : function (element, callback) {
      var initialData = [];
      $(element.val().split(",")).each(function () {
        initialData.push({
          id  : this,
          text: this
        });
      });
      callback(initialData);
    },

    // NOT NEEDED: These are just css for the demo data
    dropdownCssClass : 'capitalize',
    containerCssClass: 'capitalize',

    // configure as multiple select
    multiple         : true,

    // NOT NEEDED: text for loading more results
    formatLoadMore   : 'Loading more...',
    
    // query with pagination
    query            : function (q) {
      var pageSize,
        results;
      pageSize = 20; // or whatever pagesize
      results  = [];
      if (q.term && q.term !== "") {
        // HEADS UP; for the _.filter function i use underscore (actually lo-dash) here
        results = _.filter($('#e24').select2().data, function (e) {
          return (e.text.toUpperCase().indexOf(q.term.toUpperCase()) >= 0);
        });
      } else if (q.term === "") {
        results = $('#e24').select2().data;
      }
      q.callback({
        results: results.slice((q.page - 1) * pageSize, q.page * pageSize),
        more   : results.length >= q.page * pageSize
      });
    }
  });
});
.capitalize {
  text-transform: capitalize;
}
// Function to shuffle the demo data 
var shuffle = function (str) {
    return str.split('').sort(function () {
      return 0.5 - Math.random();
    }).join('');
  };

// For demonstration purposes we first make
// a huge array of demo data (20 000 items)
// HEADS UP; for the _.map function i use underscore (actually lo-dash) here
var mockData = function () {
    var array = _.map(_.range(1, 5000), function (i) {
        return {
          id  : i,
          text: shuffle('te ststr ing to shuffle') + ' ' + i
        };
      });
    return array;
  };

$(function () {
  // create demo data
  var dummyData = mockData();
  // set initial value(s)
  $('#e24').val([
    dummyData[75].text, dummyData[187].text
  ]);

  // init select 2
  $('#e24').select2({
    data: dummyData,
        // NOT NEEDED: These are just css for the demo data


    // configure as multiple select
    multiple         : true,

    // NOT NEEDED: text for loading more results
    formatLoadMore   : 'Loading more...',
    // query with pagination
    query: function (q) {
      var pageSize = 20, results = _.filter(this.data, function(e) {
        return (q.term == "" ||
           e.text.toUpperCase().indexOf(
               q.term.toUpperCase()) >= 0 );
      });
      q.callback({results:results.slice((q.page-1)*pageSize, q.page*pageSize),
                  more:results.length >= q.page*pageSize });
}
    
  });
});