Skip to content

Commit 4d3c5e2

Browse files
committed
feat: getValueFromObject returns the defined key value, supports dot notation string. queryData supports logicalOperators and, or
1 parent 50cd481 commit 4d3c5e2

File tree

1 file changed

+135
-65
lines changed

1 file changed

+135
-65
lines changed

src/utils.js

+135-65
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,31 @@
7373
}
7474
}
7575

76+
function getValueFromObject(json, path) {
77+
try {
78+
if (typeof json == 'undefined' || !path)
79+
return false;
80+
81+
if (/\[([0-9]*)\]/g.test(path)) {
82+
path = path.replace(/\[/g, '.');
83+
if (path.endsWith(']'))
84+
path = path.slice(0, -1)
85+
path = path.replace(/\]./g, '.');
86+
path = path.replace(/\]/g, '.');
87+
}
88+
let jsonData = json, subpath = path.split('.');
89+
90+
for (let i = 0; i < subpath.length; i++) {
91+
jsonData = jsonData[subpath[i]];
92+
if (!jsonData) return false;
93+
}
94+
return jsonData;
95+
}catch(error){
96+
console.log("Error in getValueFromObject", error);
97+
return false;
98+
}
99+
}
100+
76101
function parseTextToHtml(text) {
77102
let doc = new DOMParser().parseFromString(text, "text/html");
78103
if (doc.head.children[0]) return doc.head.children[0];
@@ -247,73 +272,116 @@
247272
}
248273
}
249274

250-
function queryData(item, query) {
251-
//. $contain, $range, $eq, $ne, $lt, $lte, $gt, $gte, $in, $nin, $geoWithin
252-
let flag = true;
253-
if (!item)
275+
function queryData(data, query) {
276+
if (!data)
254277
return false;
255-
if (!query.length)
256-
return true;
257-
258-
if (Array.isArray(item))
259-
return false;
260278

261-
for (let i = 0; i < query.length; i++) {
262-
let fieldValue = item[query[i].name];
263-
if (fieldValue == undefined)
264-
fieldValue = ''
265-
let values = query[i].value
266-
if (!Array.isArray(values))
267-
values = [values]
268-
269-
for (let value of values) {
270-
switch (query[i].operator) {
271-
case '$contain':
272-
if (!fieldValue.includes(value))
273-
flag = false;
274-
break;
275-
case '$range':
276-
if (value !== null && value !== null) {
277-
if (value[0] > fieldValue || value[1] <= fieldValue)
278-
flag = false;
279-
} else if (item.value[0] == null && value[1] >= fieldValue) {
280-
flag = false;
281-
} else if (item.value[1] == null && value[0] <= fieldValue) {
282-
flag = false;
283-
}
284-
break;
285-
case '$eq':
286-
if (fieldValue != value) flag = false;
287-
break;
288-
case '$ne':
289-
if (fieldValue == value) flag = false;
290-
break;
291-
case '$lt':
292-
if (fieldValue >= value) flag = false;
293-
break;
294-
case '$lte':
295-
if (fieldValue > value) flag = false;
296-
break;
297-
case '$gt':
298-
if (fieldValue <= value) flag = false;
299-
break;
300-
case '$gte':
301-
if (fieldValue < value) flag = false;
302-
break;
303-
case '$in':
304-
if (!Array.isArray(fieldValue) || !fieldValue.some(x => value.includes(x))) flag = false;
305-
break;
306-
case '$nin':
307-
if (Array.isArray(fieldValue) && fieldValue.some(x => value.includes(x))) flag = false;
308-
break;
309-
default:
310-
// if (!Array.isArray(fieldValue) || !fieldValue.some(x => value.includes(x))) flag = false;
311-
if (fieldValue && !fieldValue.includes(value)) flag = false;
312-
break;
313-
}
314-
}
315-
}
316-
return flag;
279+
if (!Array.isArray(data))
280+
data = [data]
281+
282+
if (!query)
283+
return true
284+
285+
if (!Array.isArray(query))
286+
query = [query]
287+
if (!query.length)
288+
return true
289+
290+
let queryResult = false
291+
for (let n = 0; n < data.length; n++) {
292+
for (let i = 0; i < query.length; i++) {
293+
let dataValue
294+
if (query[i].name.includes('.') || /\[([0-9]*)\]/g.test(query[i].name))
295+
dataValue = getValueFromObject(data[n], query[i].name)
296+
else
297+
dataValue = data[n][query[i].name]
298+
if (dataValue == undefined)
299+
dataValue = ''
300+
let logicalOperator = query[i].logicalOperator || 'or'
301+
let queryValues = query[i].value
302+
if (!Array.isArray(queryValues))
303+
queryValues = [queryValues]
304+
305+
let queryStatus = false
306+
for (let queryValue of queryValues) {
307+
if (query[i].caseSensitive != 'true' || query[i].caseSensitive != true) {
308+
if (typeof dataValue == 'string')
309+
dataValue = dataValue.toLowerCase()
310+
if (typeof queryValue == 'string')
311+
queryValue = queryValue.toLowerCase()
312+
}
313+
314+
switch (query[i].operator) {
315+
case '$includes':
316+
if (dataValue.includes(queryValue))
317+
queryStatus = true
318+
break;
319+
case '$eq':
320+
if (dataValue == queryValue)
321+
queryStatus = true
322+
break;
323+
case '$ne':
324+
if (dataValue != queryValue)
325+
queryStatus = true
326+
break;
327+
case '$lt':
328+
if (dataValue > queryValue)
329+
queryStatus = true
330+
break;
331+
case '$lte':
332+
if (dataValue >= queryValue)
333+
queryStatus = true
334+
break;
335+
case '$gt':
336+
if (dataValue < queryValue)
337+
queryStatus = true
338+
break;
339+
case '$gte':
340+
if (dataValue <= queryValue)
341+
queryStatus = true
342+
break;
343+
case '$in':
344+
if (Array.isArray(dataValue) && dataValue.some(x => queryValue.includes(x)))
345+
queryStatus = true
346+
break;
347+
case '$nin':
348+
if (!Array.isArray(dataValue) || !dataValue.some(x => queryValue.includes(x)))
349+
queryStatus = true
350+
break;
351+
case '$range':
352+
if (queryValue[0] !== null && queryValue[1] !== null) {
353+
if (dataValue >= queryValue[0] && dataValue <= queryValue[1])
354+
queryStatus = true
355+
} else if (queryValue[0] == null && dataValue <= queryValue[1]) {
356+
queryStatus = true
357+
} else if (queryValue[1] == null && dataValue >= queryValue[0]) {
358+
queryStatus = true
359+
}
360+
break;
361+
362+
default:
363+
if (dataValue.includes(queryValue))
364+
queryStatus = true
365+
break;
366+
}
367+
if (queryStatus == true) {
368+
queryResult = true
369+
break;
370+
}
371+
372+
}
373+
switch (logicalOperator) {
374+
case 'and':
375+
if (queryStatus == false)
376+
return false
377+
break;
378+
}
379+
// if (logicalOperator == 'and' && queryStatus == false)
380+
// return false
381+
}
382+
}
383+
384+
return queryResult;
317385
}
318386

319387
function searchData(data, search) {
@@ -362,6 +430,7 @@
362430
return false
363431

364432
}
433+
return true
365434
}
366435

367436
function sortData(data, sort) {
@@ -429,6 +498,7 @@
429498
return {
430499
parseTextToHtml,
431500
dotNotationToObject,
501+
getValueFromObject,
432502
cssPath,
433503
domParser,
434504
queryDocumentSelector,

0 commit comments

Comments
 (0)