UNPKG

mingo

Version:

MongoDB query language for in-memory objects

34 lines (33 loc) 1.13 kB
import { Query } from "../../query"; import { isArray, isObject, isOperator } from "../../util"; import { applyUpdate, DEFAULT_OPTIONS, walkExpression } from "./_internal"; function $pull(expr, arrayFilters = [], options = DEFAULT_OPTIONS) { const predicates = Object.values(expr).map((pullSpec) => { const wrap = !isObject(pullSpec) || Object.keys(pullSpec).some(isOperator); const query = new Query(wrap ? { k: pullSpec } : pullSpec, options); return wrap ? (v) => query.test({ k: v }) : (v) => query.test(v); }); return (obj) => { let index = 0; return walkExpression(expr, arrayFilters, options, (_, node, queries) => { const pred = predicates[index++]; return applyUpdate(obj, node, queries, (o, k) => { const prev = o[k]; if (!isArray(prev) || !prev.length) return false; const curr = new Array(); let ok = false; for (const v of prev) { const b = pred(v); if (!b) curr.push(v); ok ||= b; } if (!ok) return false; o[k] = curr; return true; }); }); }; } export { $pull };