mingo
Version:
MongoDB query language for in-memory objects
25 lines (24 loc) • 932 B
JavaScript
import { ComputeOptions, computeValue } from "../../../core/_internal";
import { assert, has, isArray, isNil, isObject } from "../../../util";
import { errExpectArray } from "../_internal";
const $reduce = (obj, expr, options) => {
assert(
isObject(expr) && has(expr, "input", "initialValue", "in"),
"$reduce expects object { input, initialValue, in }"
);
const input = computeValue(obj, expr.input, null, options);
const initialValue = computeValue(obj, expr.initialValue, null, options);
const inExpr = expr["in"];
if (isNil(input)) return null;
if (!isArray(input))
return errExpectArray(options.failOnError, "$reduce 'input'");
const copts = ComputeOptions.init(options);
const locals = { variables: { value: null } };
return input.reduce((acc, n) => {
locals.variables.value = acc;
return computeValue(n, inExpr, null, copts.update(locals));
}, initialValue);
};
export {
$reduce
};