Skip to content

Commit 740c98f

Browse files
committed
fix: improved handeling of $nin operator
1 parent e52bc3c commit 740c98f

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

src/index.js

+46-6
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@
109109
for (let i = 0; i < keys.length; i++) {
110110
if (/\[([0-9]*)\]/g.test(keys[i])) {
111111
let [k, index] = keys[i].split('[');
112-
index = index.slice(0, -1)
112+
index = index.slice(0, -1) || 0
113+
newObject[k] = oldObject[k] || [];
113114
if (length == i) {
114115
if (value === undefined)
115116
newObject[k].splice(index, 1);
116117
else
117118
newObject[k][index] = value;
118119
} else {
119-
newObject[k] = oldObject[k] || [];
120120
newObject[k][index] = oldObject[k][index] || {};
121121
newObject = newObject[k][index]
122122
oldObject = oldObject[k][index]
@@ -478,8 +478,16 @@
478478
queryStatus = true
479479
break;
480480
case '$ne':
481-
// if (dataValue != queryValue)
482-
queryStatus = (dataValue != queryValue)
481+
if (Array.isArray(dataValue)) {
482+
// Check if the entire array is different from queryValue
483+
queryStatus = !isEqualArray(dataValue, queryValue);
484+
} else if (Array.isArray(queryValue)) {
485+
// If queryValue is an array, check if dataValue is different from this array
486+
queryStatus = !isEqualArray(queryValue, dataValue);
487+
} else {
488+
// If neither is an array, simple comparison
489+
queryStatus = (dataValue != queryValue);
490+
}
483491
break;
484492
case '$lt':
485493
if (dataValue < queryValue)
@@ -502,8 +510,11 @@
502510
queryStatus = true
503511
break;
504512
case '$nin':
505-
if (!Array.isArray(dataValue) || !dataValue.some(x => queryValue.includes(x)))
506-
queryStatus = true
513+
if (Array.isArray(dataValue)) {
514+
queryStatus = !dataValue.some(element => queryValue.includes(element));
515+
} else {
516+
queryStatus = !queryValue.includes(dataValue);
517+
}
507518
break;
508519
case '$range':
509520
if (queryValue[0] !== null && queryValue[1] !== null) {
@@ -540,6 +551,35 @@
540551
return queryResult;
541552
}
542553

554+
function isEqualArray(arr1, arr2) {
555+
if (arr1.length !== arr2.length) {
556+
return false;
557+
}
558+
for (let i = 0; i < arr1.length; i++) {
559+
if (!isEqualObject(arr1[i], arr2[i])) {
560+
return false;
561+
}
562+
}
563+
return true;
564+
}
565+
566+
function isEqualObject(obj1, obj2) {
567+
const keys1 = Object.keys(obj1);
568+
const keys2 = Object.keys(obj2);
569+
570+
if (keys1.length !== keys2.length) {
571+
return false;
572+
}
573+
574+
for (const key of keys1) {
575+
if (obj1[key] !== obj2[key]) {
576+
return false;
577+
}
578+
}
579+
580+
return true;
581+
}
582+
543583
function searchData(data, search) {
544584
if (!search)
545585
return true

0 commit comments

Comments
 (0)