JSFiddle - React, Tailwind, and code Playground
by st3fan
JavaScript
var filterArray = function(list, filter, query) {
//console.log('filterArray', arguments);
if (typeof filter !== 'function')
return;
var args = Array.prototype.slice.call(arguments, 2), // Exclude list and filter
matches = [];
for (var i = 0; i < list.length; i++) {
var a = [list[i]].concat(args);
var test = filter.apply(this, a);
if (test) matches.push(list[i]);
}
return matches;
};
// Custom filters
var filters = {};
filters.contains = function(value, query) {
//console.log('contains', arguments); // DEBUG
return value.indexOf(query) > -1;
};
filters.equals = function(value, query) {
//console.log('equals', arguments); // DEBUG
return value === query;
};
// Array.prototype
Array.prototype.addFunction = function(name, func) {
this[name] = func;
};
Array.prototype.addFilter = function(name, filter) {
console.log('addFilter', arguments); // DEBUG
var args = arguments;
this[name] = function(query) {
var args = Array.prototype.slice.call(arguments),
args = [this, filter].concat(args);
return filterArray.apply(this, args);
};
};
// Tests
var assert = function(name, result) {
var test = _.isEqual(result, arguments[2]);
console.log('assert', arguments.length, arguments, test); // DEBUG
console.log( name, test ? 'PASSED' : 'ERROR' );
};
var array = [ 'yellow', 'green', 'red', 'blue', 'purple', 'orange', 'black', 'white' ];
var query = 'a';
var expectation = [ 'orange', 'black' ];
// Add filter: contains
for (var filterName in filters) { Array.prototype.addFilter(filterName, filters[filterName]); }
//Array.prototype.addFilter('contains', filters.contains);
//Array.prototype.addFilter('equals', filters.equals);
var a = filterArray(array, filters.contains, query);
assert('Test A', a, expectation); // TEST
var b = array.contains(query, 'Extra argument?');
assert('Test B', b, expectation); // TEST