'use strict';

var invalidEntries;

function filterByID(element) {
  if (element.id && ('number' === typeof element.id)) {
    return true;
  }
  invalidEntries++;
  return false;
}

function filterByExtension(element) {
  if (element.path && ('string' === typeof element.path)) {
    var pathArr = element.path.split('.');
    var extension = pathArr[pathArr.length - 1];
    if (extension === 'txt') {
      return true;
    }
  }
  invalidEntries++;
  return false;
}

function sortByID(arr) {
  return arr.sort(function(first, second) {
    return (first.id - second.id);
  });
}

var files = [{
  id: 15,
  path: 'foo.txt'
}, {
  id: 1,
  path: 'bar.1.txt'
}, {
  id: 3,
  path: 'mine.txt'
}, {
  id: 2,
  path: 'yours.txt'
}, {
  id: 4,
  path: 'yours.txt.diff'
}, {
  id: undefined,
  path: null
}, {
  id: null,
  path: null
}, {
  path: 'foo.bar.txt'
}];

(function(files) {
  invalidEntries = 0;
  var sortedAndFilterededArr = files
    .filter(filterByID)
    .filter(filterByExtension)
    .sort(function(first, second) {
      return first.id - second.id;
    });

  console.log('Number of Invalid Entries = ', invalidEntries); // 7
  console.log('Filtered And Sorted Array \n', sortedAndFilterededArr);
  /* [
      {id: 1, path:'bar.1.txt'}, 
      {id: 2, path:'yours.txt'}, 
      {id: 3, path:'mine.txt'}, 
      {id: 15, path:'foo.txt'}
     ];
  */
})(files);