JSFiddle - React, Tailwind, and code Playground

by vrmtm

JavaScript

var data = [
	{ name: "jonas", age: 17, drink: "alus" },
  { name: "petras", age: 19, drink: "vynas" },
  { name: "zose", age: 66, drink: "vynas" },
  { name: "ekerepla", age: 39, drink: "viskis" },
];

var filterMapping = [
	{
  	Action: "GreaterThan",
		ColumnTitle: "age",
		Operator: null,
		Value: 18
  },
  {
    Action: "Equals",
      ColumnTitle: "drink",
      Operator: "and",
      Value: "vynas"
  },
  {
    Action: "Equals",
      ColumnTitle: "name",
      Operator: "or",
      Value: "ekerepla"
  },
];

var filteredData = data.filter(function (tadaItem) {
	return tadaItem.age > 18 && tadaItem.drink == "vynas" || tadaItem.name == "ekerepla";
});

/* console.log(filteredData); */

function doAction(a, b, action) {
	switch (action) {
    case 'GreaterThan':
      return a > b;
    case 'Equals':
    	return a === b;
    default:
    	console.error('doAction: not implemented:', action)
    	return true;
  }
}

function doOperator(a, b, operator) {
	switch (operator) {
  	case 'and':
    	return a && b;
    case 'or':
    	return a || b;
    default:
      if (operator !== null) {
	    	console.error('doOperator: not implemented:', operator)
      }
    	return b;
  }
}

function filterData(item) {
	return filterMapping.reduce(function(prev, next) {
    const itemValue = item[next.ColumnTitle];
    const actionOutcome = doAction(itemValue, next.Value, next.Action);
    return doOperator(prev, actionOutcome, next.Operator)
  }, true);
}

const filteredData2 = data.filter(filterData);

console.log(filteredData2);