UNPKG

foop

Version:

interfaces that describe their intentions.

75 lines (72 loc) 6.7 kB
// const forOwn = require('../loop/each/forOwn') var hasOwnProperty = require('../util/hasOwnProperty') var isObj = require('../is/obj') var curry = require('./curry') /** * Takes a spec object and a test object returns true if the test satisfies * the spec. Each of the spec's own properties must be a predicate function. * Each predicate is applied to the value of the corresponding property of the * test object. `where` returns true if all the predicates return true, false * otherwise. * * `where` is well suited to declaratively expressing constraints for other * functions such as [`filter`](#filter) and [`find`](#find). * * @since 5.0.0-beta.6 * @memberOf fp * @curried 2 * * @param {Object} spec * @param {Object} testObj * @return {Boolean} * * @tests fp/where * * {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L323 underscore-where} * {@link https://github.com/lodash/lodash/blob/master/.internal/baseConformsTo.js lodash-conformsto} * {@link https://github.com/ramda/ramda/blob/v0.24.1/src/where.js ramda-where} * @see {@link underscore-where} * @see {@link ramda-where} * @see {@link lodash-conformsto} * * @func * @fork v0.1.1 * @category Object * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean * * @example * * // pred :: Object -> Boolean * var pred = where({ * a: equals('foo'), * b: not(equals('bar')), * x: gt('_', 10), * y: lt('_', 20) * }) * * pred({a: 'foo', b: 'xxx', x: 11, y: 19}) //=> true * pred({a: 'xxx', b: 'xxx', x: 11, y: 19}) //=> false * pred({a: 'foo', b: 'bar', x: 11, y: 19}) //=> false * pred({a: 'foo', b: 'xxx', x: 10, y: 19}) //=> false * pred({a: 'foo', b: 'xxx', x: 11, y: 20}) //=> false * */ module.exports = curry(2, function where(spec, testObj) { // forOwn(spec, (test, prop) => { // hasOwnProperty(testObj, prop) && !spec[prop](testObj[prop]) // }) for (var prop in spec) { if (hasOwnProperty(spec, prop)) { if (isObj(spec[prop]) && hasOwnProperty(testObj, prop)) { if (!where(spec[prop], testObj[prop])) { return false } } else if (!hasOwnProperty(testObj, prop) || !spec[prop](testObj[prop])) { return false } } } return true }) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VzIjpbIndoZXJlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGNvbnN0IGZvck93biA9IHJlcXVpcmUoJy4uL2xvb3AvZWFjaC9mb3JPd24nKVxuY29uc3QgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKCcuLi91dGlsL2hhc093blByb3BlcnR5JylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi4vaXMvb2JqJylcbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi9jdXJyeScpXG5cbi8qKlxuICogVGFrZXMgYSBzcGVjIG9iamVjdCBhbmQgYSB0ZXN0IG9iamVjdCByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2F0aXNmaWVzXG4gKiB0aGUgc3BlYy4gRWFjaCBvZiB0aGUgc3BlYydzIG93biBwcm9wZXJ0aWVzIG11c3QgYmUgYSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKiBFYWNoIHByZWRpY2F0ZSBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvZiB0aGVcbiAqIHRlc3Qgb2JqZWN0LiBgd2hlcmVgIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHByZWRpY2F0ZXMgcmV0dXJuIHRydWUsIGZhbHNlXG4gKiBvdGhlcndpc2UuXG4gKlxuICogYHdoZXJlYCBpcyB3ZWxsIHN1aXRlZCB0byBkZWNsYXJhdGl2ZWx5IGV4cHJlc3NpbmcgY29uc3RyYWludHMgZm9yIG90aGVyXG4gKiBmdW5jdGlvbnMgc3VjaCBhcyBbYGZpbHRlcmBdKCNmaWx0ZXIpIGFuZCBbYGZpbmRgXSgjZmluZCkuXG4gKlxuICogQHNpbmNlIDUuMC4wLWJldGEuNlxuICogQG1lbWJlck9mIGZwXG4gKiBAY3VycmllZCAyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNwZWNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0ZXN0T2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICpcbiAqIEB0ZXN0cyBmcC93aGVyZVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvYmxvYi9tYXN0ZXIvdW5kZXJzY29yZS5qcyNMMzIzIHVuZGVyc2NvcmUtd2hlcmV9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2Jhc2VDb25mb3Jtc1RvLmpzIGxvZGFzaC1jb25mb3Jtc3RvfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS9ibG9iL3YwLjI0LjEvc3JjL3doZXJlLmpzIHJhbWRhLXdoZXJlfVxuICogQHNlZSB7QGxpbmsgdW5kZXJzY29yZS13aGVyZX1cbiAqIEBzZWUge0BsaW5rIHJhbWRhLXdoZXJlfVxuICogQHNlZSB7QGxpbmsgbG9kYXNoLWNvbmZvcm1zdG99XG4gKlxuICogQGZ1bmNcbiAqIEBmb3JrIHYwLjEuMVxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAoKiAtPiBCb29sZWFuKX0gLT4ge1N0cmluZzogKn0gLT4gQm9vbGVhblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyBwcmVkIDo6IE9iamVjdCAtPiBCb29sZWFuXG4gKiAgICAgIHZhciBwcmVkID0gd2hlcmUoe1xuICogICAgICAgIGE6IGVxdWFscygnZm9vJyksXG4gKiAgICAgICAgYjogbm90KGVxdWFscygnYmFyJykpLFxuICogICAgICAgIHg6IGd0KCdfJywgMTApLFxuICogICAgICAgIHk6IGx0KCdfJywgMjApXG4gKiAgICAgIH0pXG4gKlxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAxOX0pIC8vPT4gdHJ1ZVxuICogICAgICBwcmVkKHthOiAneHh4JywgYjogJ3h4eCcsIHg6IDExLCB5OiAxOX0pIC8vPT4gZmFsc2VcbiAqICAgICAgcHJlZCh7YTogJ2ZvbycsIGI6ICdiYXInLCB4OiAxMSwgeTogMTl9KSAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAneHh4JywgeDogMTAsIHk6IDE5fSkgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAyMH0pIC8vPT4gZmFsc2VcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY3VycnkoMiwgZnVuY3Rpb24gd2hlcmUoc3BlYywgdGVzdE9iaikge1xuICAvLyBmb3JPd24oc3BlYywgKHRlc3QsIHByb3ApID0+IHtcbiAgLy8gICBoYXNPd25Qcm9wZXJ0eSh0ZXN0T2JqLCBwcm9wKSAmJiAhc3BlY1twcm9wXSh0ZXN0T2JqW3Byb3BdKVxuICAvLyB9KVxuXG4gIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzcGVjLCBwcm9wKSkge1xuICAgICAgaWYgKGlzT2JqKHNwZWNbcHJvcF0pICYmIGhhc093blByb3BlcnR5KHRlc3RPYmosIHByb3ApKSB7XG4gICAgICAgIGlmICghd2hlcmUoc3BlY1twcm9wXSwgdGVzdE9ialtwcm9wXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWhhc093blByb3BlcnR5KHRlc3RPYmosIHByb3ApIHx8ICFzcGVjW3Byb3BdKHRlc3RPYmpbcHJvcF0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEsR0FBSyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUM7QUFDeERBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNsQ0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtRGhDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFOzs7OztFQUt0RCxLQUFLQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtJQUNyQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7TUFDOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtRQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtVQUNyQyxPQUFPLEtBQUs7U0FDYjtPQUNGO1dBQ0ksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDckUsT0FBTyxLQUFLO09BQ2I7S0FDRjtHQUNGO0VBQ0QsT0FBTyxJQUFJO0NBQ1osQ0FBQzsifQ==