Я пытаюсь объединить несколько запросов в один объект: пользователь может создавать запросы из предварительно выбранных параметров и выбирать оператор and или or. Все запросы выводятся правильно, но когда помещаю их в объект, я получаю «Ошибка: $ и / $ или / $ и не должен быть непустым массивом».
Например. Допустим, у нас есть запрос a AND b AND c AND d AND e, результат должен быть: {$ and [a, $ and: [b, $ and: [c, $ and: [d, e]]]]} это так что, если они выберут другой оператор, операция все равно останется той же
Вот код:
function nestOps(ops, queries) {
let queryObj = {};
if (ops.length > 1) {
let querySet = {};
querySet[`$${ops[ops.length - 1]}`] = [queries[ops.length - 1], queries[ops.length]];
for (let i = ops.length - 2; i > 0; i--) {
let next = {};
next[`$${ops[i]}`] = querySet;
querySet = {};
let nextIdx = i - 1;
if (nextIdx > 0) {
querySet[`$${ops[nextIdx]}`] = [queries[i], next];
i--;
}
else {
querySet = next;
}
}
queryObj[`$${ops[0]}`] = [querySet, queries[0]];
}
else {
queryObj[`$${ops[0]}`] = [...queries];
}
return queryObj;
}
Я пробовал делать это с помощью рекурсии, однако мой стек довольно раздут (даже с увеличенным размером стека), и я не вижу, как использовать метод хвоста ("return nextCall ()"), поскольку мне нужно вернуть предыдущий запрос с добавлением или указанием и я не могу сделать это без предварительного задания.
Вот вывод консоли:
Output Object
$and: Array(2)
0:
$and: Array(2)
0: {questions: {…}}
1:
$and: // could be an error here but, I don't understand why
$and: Array(2)
0: {$or: Array(2)} //this happens due to a query, it is not an error
1: {questions: {…}}
Operators
["and", "and", "and", "and"]
Queries
(5) [{…}, {…}, {…}, {…}, {…}]
0: {questions: {…}}
1: {completedAt: {…}}
2: {questions: {…}}
3: {$or: Array(2)}
4: {questions: {…}}
1 ответ
Вместо создания вложенных $and
вы можете упростить его, используя один $and
.
{ property: { $and: [ {filter}, {filter} ] }}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.
{$and: [all the options here]}
вместо вложенного и? Я не уверен, что это допустимая операция$and
.