Last active
December 10, 2019 02:02
-
-
Save cedrickvstheworld/31b62c47aced15f0eb3db4eff8c03339 to your computer and use it in GitHub Desktop.
dataFilter.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* order, orderBy, search by text, and set offset / limit for array of objects (depth = 1) | |
*/ | |
const sample = [ | |
{ | |
name: "cDudeson", | |
age: 32 | |
}, | |
{ | |
name: "aDeedee", | |
age: 32 | |
}, | |
{ | |
name: "bJed", | |
age: 21 | |
} | |
] | |
const dataFilter = (data, searchText, orderBy, order, offset=0, limit=0, searchFields=[]) => { | |
return new Promise((resolve, reject) => { | |
if (!Array.isArray(data)) { | |
return reject('data must be an array') | |
} | |
// filter by searchText | |
let filtered = data.filter((elem) => { | |
const match = new RegExp(searchText, 'i') | |
let keys = searchFields.length !== 0 ? searchFields : Object.keys(elem) | |
for (let ii in keys) { | |
if (match.test(elem[keys[ii]])) { | |
return elem | |
} | |
} | |
}) | |
const dataLength = filtered.length | |
let ordered = filtered.sort(sortCompareObject(orderBy, order)) | |
let result = ordered | |
if (limit && !offset) { | |
result = ordered.splice(0, limit) | |
} | |
else if (!limit && offset) { | |
result = ordered.splice(offset) | |
} | |
else if (limit && offset) { | |
result = ordered.splice(offset, limit) | |
} | |
resolve({ | |
data: result, | |
totalPages: !limit ? (!dataLength ? 0 : 1) : Math.ceil(dataLength / limit), | |
totalCounts: dataLength | |
}) | |
}) | |
} | |
const sortCompareObject = (key, order = 'ASC') => { | |
return function compare(l, r) { | |
if (!l.hasOwnProperty(key) || !r.hasOwnProperty(key)) { | |
return 0 | |
} | |
const lVal = typeof l[key] === 'string' ? l[key].toUpperCase() : l[key] | |
const rVal = typeof r[key] === 'string' ? r[key].toUpperCase() : r[key] | |
let evaluator = 0 | |
if (lVal > rVal) { | |
evaluator = 1 | |
} | |
else if (lVal < rVal) { | |
evaluator = -1 | |
} | |
return order === 'DESC' ? evaluator * -1 : evaluator | |
} | |
} | |
dataFilter(sample, '', 'name', 'ASC', 0, 5) | |
.then((data) => { | |
console.log(data) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment