'use strict'; var values = require('../helpers/values'); var nestedValue = require('../helpers/nestedValue'); module.exports = function where(key, operator, value) { var comparisonOperator = operator; var comparisonValue = value; var items = values(this.items); if (operator === undefined || operator === true) { return new this.constructor(items.filter(function (item) { return nestedValue(item, key); })); } if (operator === false) { return new this.constructor(items.filter(function (item) { return !nestedValue(item, key); })); } if (value === undefined) { comparisonValue = operator; comparisonOperator = '==='; } var collection = items.filter(function (item) { switch (comparisonOperator) { case '==': return nestedValue(item, key) === Number(comparisonValue) || nestedValue(item, key) === comparisonValue.toString(); default: case '===': return nestedValue(item, key) === comparisonValue; case '!=': case '<>': return nestedValue(item, key) !== Number(comparisonValue) && nestedValue(item, key) !== comparisonValue.toString(); case '!==': return nestedValue(item, key) !== comparisonValue; case '<': return nestedValue(item, key) < comparisonValue; case '<=': return nestedValue(item, key) <= comparisonValue; case '>': return nestedValue(item, key) > comparisonValue; case '>=': return nestedValue(item, key) >= comparisonValue; } }); return new this.constructor(collection); };