|
73 | 73 | }
|
74 | 74 | }
|
75 | 75 |
|
| 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 | + |
76 | 101 | function parseTextToHtml(text) {
|
77 | 102 | let doc = new DOMParser().parseFromString(text, "text/html");
|
78 | 103 | if (doc.head.children[0]) return doc.head.children[0];
|
|
247 | 272 | }
|
248 | 273 | }
|
249 | 274 |
|
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) |
254 | 277 | return false;
|
255 |
| - if (!query.length) |
256 |
| - return true; |
257 |
| - |
258 |
| - if (Array.isArray(item)) |
259 |
| - return false; |
260 | 278 |
|
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; |
317 | 385 | }
|
318 | 386 |
|
319 | 387 | function searchData(data, search) {
|
|
362 | 430 | return false
|
363 | 431 |
|
364 | 432 | }
|
| 433 | + return true |
365 | 434 | }
|
366 | 435 |
|
367 | 436 | function sortData(data, sort) {
|
|
429 | 498 | return {
|
430 | 499 | parseTextToHtml,
|
431 | 500 | dotNotationToObject,
|
| 501 | + getValueFromObject, |
432 | 502 | cssPath,
|
433 | 503 | domParser,
|
434 | 504 | queryDocumentSelector,
|
|
0 commit comments